第十届蓝桥杯决赛B组:排列数

2023-11-11

这题我们用动态规划做!

首先我们来找规律:

对于一个递增的数列,如123456,我们插入一个数。这个数大于数列中所有的数,这里插入7。如果不插在两端(1, 6)的数两侧,则增加了两个拐点,如1273456;插在(1, 6)的内测,有两种情况,如1723456和1234576;插在两端,有两种情况,7123456和1234567。

向一个数列的拐点两侧插入数字时,如果这个拐点比两边的数大,则拐点数不增加,如132变成1432或1342;如果这个拐点比两边的数小,则拐点数加2,如312变成3412或3142.

然后我们可以把插入数分为不增加拐点,增加1个拐点和增加两个拐点,共三种情况。

让dp[i][j]表示长度为i的列,拐点数为j时的所有排列的种数。

令大于两端数的拐点为第一类拐点,小于为第二类拐点。

情况一:不增加拐点,在dp[i-1][j]中插入数字i,我们发现第一类拐点的总数+第二类拐点的总数为j,而对于每种排列,都能让它的第一类拐点变成第二类,第二类变成第一类,如1423>>-1-4-2-3>>4132 及取负数在加上最大数再加一。因此可以证明所有情况的第一类拐点与第二类拐点的总和相同,及对于一种情况,选取第一类拐点,总有另一种情况,选择对应位置的第二类拐点(可以理解为把所有情况两两合并,要选的第一类拐点数总和就为j)。因此有2*0.5*dp[i-1][j]*j种情况,(2代表拐点两侧,0.5*dp[i-1][j]*j为所有第一类拐点的总数,)。然后还可以在两端外侧插入数字i,有dp[i-1][j]种情况。加起来就是(j+1)*dp[i-1][j]。

情况二:加一个拐点,只能在两端数的外侧和内侧加,也是两两合并的思想,有2*dp[i-1][j-1]种情况。

情况三:加两个拐点,对应dp[i-1][j-2]。同样的,总有两种情况的第一类拐点总数加起来为j-2,每个第一类拐点两端不能加故有2*(j-2)个位置不能加。两端数的外侧不能加,因此还有i-2个空位,两种情况就是2*(i-j)个空位。所以增加了0.5*dp[i-1][i-2]*(2*i-2*j)种情况。

得出状态方程:

dp[i][j] = (j+1)*dp[i-1][j] + 2*dp[i-1][j-1]
if i > j > 1:
    dp[i][j] += dp[i-1][j-2]*(i-j)

#  考虑j<2时没有可以增加两个的情况

下面是代码

n, k = map(int, input().split())
#  创建dp
dp = [[0]*k for _ in range(n)]
for i in range(1, n):
    #  这里长度其实为i+1,从长度为二的数列开始算
    #  没拐点情况就两种,单增与单减
    dp[i][0] = 2
    for j in range(1, k):
        dp[i][j] = (j+1)*dp[i-1][j] + 2*dp[i-1][j-1]
        # 特殊情况,显然i总是要大于j的,拐点数不可能比数列还长,而j-1要大于等于0
        if i > j > 1:
            dp[i][j] += dp[i-1][j-2]*(i-j)
        #  题目要求模上123456
        dp[i][j] %= 123456
print(dp[n-1][k-1])

蓝桥杯练习系统100分,看不懂可以私信问我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第十届蓝桥杯决赛B组:排列数 的相关文章

随机推荐

  • ajax中如何隐藏列,【JS】在chrome等浏览器中,如何隐藏掉ajax请求,使其不会显示在console中...

    由于项目的保密性需要 需要隐藏掉ajax请求接口的地址 请问各位都是怎么做的 回答 纯后端渲染 不用ajax 后端的安全性怎么可能让前端来保证 你最多只能签名一下参数 可以尝试使用中转服务器 假设服务器 B 需要保密 你可以转而请求 A 服
  • Java类加载器

    目录 0 知识储备 JVM内存分区 双亲委派机制 1 Java类加载机制 1 1核心类加载器启动原理 类加载的含义 类加载过程 1 类的加载 2 类的连接 3 初始化 1 2类加载的双亲委派机制 2 类加载器的类型 3 自定义类加载器的实现
  • eclipse svn 忽略 target/.project /.classpath /.settings等 目录

    问题描述 用eclipse同步项目时 会出现target project classpath settings等与代码无关的文件 介绍两种办法 推荐第二种 方法一 在新建项目的时候 在第一次commit 到 SVN 之前 先在项目的根目录设
  • L1,L2,L3 Cache缓存原理

    一 介绍 CPU缓存 Cache Memory 也被称为Cache 是存储器子系统的组成部分 存放着程序经常使用的指令和数据 从广义的角度上看 Cache是快设备为了缓解访问慢设备延时的预留的Buffer 从而可以在掩盖访问延时的同时 尽可
  • qt 中报 error: No rule to make target 这个错误的就解决方法

    最近在用qt设计数据库课设的前端界面 在做好的界面更改资源文件时qt给报了这个错误 error No rule to make target one OneDrive 01 png needed by debug qrc res cpp 我
  • LDAP 常用名词

    LDAP目录结构的最顶部就是根 也就是所谓的基准 DN DN通常有一下三种格式为 DN domain name 域名 域名系统 域名服务器 假定我在一家电子商务公司工作 这家公司在internet上的名字为foobar com o foob
  • web前端统计埋点分离方案

    前言 最近一直在思考一个吸引人的标题对一篇文章的阅读到底影响有多大 所以这篇文章取了一个比较大的标题 内容是炒冷饭 主要是再介绍一下之前在业务里遇见关于统计埋点的问题 以及我的解决方案 Tagmanager Tagmanager tagma
  • selenium解决下拉表单和浏览器下拉进度条问题的问题

    1 有的时候使用selenium自动化模块时会遇到下拉表单的问题 name如何解决这个问题呢 Selenium专门提供了Select类来处理下拉框 导入 Select 类 from selenium webdriver support ui
  • 网站发布一般步骤以及解决方法

    1 在D盘 随便一个地方 新建文件夹 2 在vs项目中点击发布弹出对话框 3 配置文件选择自定义 4 下一步 Publish method 选择file system 5 target location选择第一步创建的文件夹 6 下一步 f
  • 《软件测试的艺术》

    1 每当测试一个程序时 应当想到要为程序增加一些价值 通过测试来增加程序的价值 是指测试提高了程序的可靠性或质量 提高了程序的可靠性 是指找出并最终修改了程序的错误 因此 不要只是为了证明程序能够正确运行而去测试程序 相反 应该一开始就假设
  • datetime数据类型在页面上的显示不完全

    下面两个代码全包含在script标签中 function fmtDate sDate var dt new Date sDate var y dt getFullYear var m dt getMonth 1 var d dt getDa
  • 用VS2015开发Linux程序

    1 开发工具 VS2015Update3 Visual C for Linux Development VC Linux exe 下载链接 介绍 VMware 虚拟机软件 ubuntu 16 04 desktop amd64 iso Lin
  • C# 预处理器指令(学习心得 24)

    预处理器指令 指导编译器在实际编译开始之前对信息进行预处理 所有的预处理器指令都是以 开始 在一行上 只有空白字符可以出现在预处理器指令之前 预处理器指令不是语句 所以它们不以 分号 结束 一个预处理器指令必须是该行上的唯一指令 超级小白友
  • Mysql 一主多备安装部署文档

    Mysql 一主多备安装部署文档 文章目录 Mysql 一主多备安装部署文档 1 主节点配置 1 1 my cnf 配置 1 2 配置同步账号 1 3 授权同步账号 1 4 授权远程登录 1 5 刷新 1 6 查看Master状态 2 Sl
  • vmware workstation 16 player 导出虚拟机ovf文件

    vmware workstation 16 player 导出虚拟机ovf文件 1 找到vm的ovftool 位于C Program Files x86 VMware VMware Player OVFTool 2 找到虚拟机对应 vmx文
  • MATLAB对csv文件的某一列数据进行数据处理

    clc clear all close all M csvread shui A Aref csv 1 2 N csvread kongA Aref csv 1 2 baseline 1 mean M 1 16 baseline 2 mea
  • UWB的定位算法(简单详细易懂)

    系列文章目录 文章目录 系列文章目录 前言 一 控制部分 二 UWB 的测距原理是什么 三 TOF 数学计算 四 Trilateration 三边测量法的原理与计算方法 TDOA平面 1 三边测量法的缺陷是 2 Z 轴准确度比 X 轴 Y
  • 多项目同时进行,如何做好项目管理?

    大部分企业在运营过程中一般会存在多个项目并行推进的情况 一段时间只运营一个项目的情况已经很少 无论是对项目管理者还是项目执行者而言 多项目同时进行比单项目运行更具挑战 多项目管理一般会存在各项目之间抢资源 资源冲突 资源分配不合理 可能存在
  • 使用node-forge pki进行RSA加密

    先放npm官方文档 www npmjs com package node forge 在知道RSA加密的大致原理后 再往下看 使用例子 简单写个方法 引入依赖 import forge from node forge base64转换 一般
  • 第十届蓝桥杯决赛B组:排列数

    这题我们用动态规划做 首先我们来找规律 对于一个递增的数列 如123456 我们插入一个数 这个数大于数列中所有的数 这里插入7 如果不插在两端 1 6 的数两侧 则增加了两个拐点 如1273456 插在 1 6 的内测 有两种情况 如17