Skip to content

Part 1 排列 DP

1. AT_dp_t Permutation / UVA1650 数字串 Number String

实际上,对于 16 的一个排列,如果 1 2 6 5 4 3 是合法的,那么 1 3 8 6 7 5 也是合法的。

也就是说,题目并不关心这几个数是否真的是 16 的一个排列,所以可以考虑不考虑这些数值的实际大小,而是关心他们相对的排名。

fi,j 表示处理好前 i 个位置,其中第 i 个位置放在这 i 个数中排名为 j 的数。

如果这一位需要比前一位大(这一位是 <),那么:

fi,j=k=1j1fi1,k

如果这一位需要比前一位小(这一位是 >),那么:

fi,j=k=ji1fi1,k

2. AT_abc209_f [ABC209F] Deforestation

先讨论什么时候价值最小:

  • 先砍 i,再砍 i+1,代价是 ai1+ai+ai+1+ai+1+ai+2

  • 先砍 i+1,再砍 i,代价是 ai+ai+1+ai+2+ai1+ai

  • 上减下得 ai+1ai

  • 也就是说,当 ai<ai+1 时,先砍 i 最优;当 ai>ai+1 时,先砍 i+1 最优。

题目变为有多少种排列 piapi<api+1

上一题改改即可。

3. 【重点】P5999 [CEOI2016] kangaroo

从另一种角度看排列 DP,这一角度下排列 DP 通常的设法是:设 fi,j 表示前 i 个数组成了 j 段答案的方案数,答案即为 fn,1

状态是什么意思呢?比如对于上面 T1,现在求出三部分答案区间:(1)(5,3)(2,4),这些区间内部都必须满足答案要求的性质。这就是 f5,3 包含的一种方案。

对于这样的状态,一般有三种操作:

  1. 随便挑一段区间将第 i 个数接到它的结尾:
fi,j=fi1,j×j
  1. 自己开一段区间,由于这一段区间可能插在上一个状态的 j1 段形成的 j 个空(包含序列两端也可以插入)中的任意一个空中,所以:
fi,j=fi1,j1×j
  1. 合并左区间和右区间,自己放到中间,上一个状态的 j+1 段只有 j 个“中间”(序列两端的,显然不能合并),所以:
fi,j=fi1,j+1×j

回到这一题。这道题的本质是求上面 T1 中的 ><>< 序列和 <><> 序列的总方案数,只不过固定了开头数和结尾数。

用同样的方法设状态,从小到大考虑插入每一个数。

  • 不存在第一种操作,因为从小到大考虑,要是个个数都直接往前面序列的后面接,必然会形成一个完全单调递增的“答案序列”,和题意不符。

  • 第二种操作必然合法,它新开一段区间,前后都没有数,没有大于小于的比较。

  • 第三种操作必然合法,因为从小到大考虑,现在考虑的数肯定比之前的数都要大,把自己放到中间合并任意两个区间,都能构成以自己为中心的 <>

  • 对于起点,它的操作二只有插在序列开头一种方案,所以 fi,j=fi1,j1 即可,不用 ×j。它的

4. 摆花

5. 数列

6. CF1806D DSU Master

7. P9197 JOI Open 2016 摩天大楼

8. CF1437F Emotional Fisherman

9. CF1439D INOI Final Contests

10. AT_agc030_f [AGC030F] Permutation and Minimum_

11. P7213 [JOISC2020] 最古の遺跡 3

Part 2 线性 DP

1. AT_abc281_g [ABC281G] Farthest City

2. CF1476F Lanterns

3. AT_agc035_e [AGC035E] Develop

Part 3 树形 DP

1. P6383 『MdOI R2』Resurrection

对上脑电波了(喜,可能是这题比较简单。

说句闲话,我语文素养较低,导致我看题意看了半天。

首先,对于“从 un 号节点的简单路径都不经过任何编号小于 u 的节点”,即从 un 节点编号单调递增,就可以想到把 n 当作原树的根,有 depu<depv,u>v

接着画图想它的断边操作,可以发现新树中,某个节点的父亲一定是原树中的祖先,因为如果从 x 节点往下拐得到 y 是最大的,那就违背了上一行的规律。

所以问题就变成了:以 n 为根,随便将一些节点往上挂,能够得到多少种新树。

但是“随便”是不够的,会发现样例都过不了,其实还有个条件:每个节点在新树中的深度,都必须大于等于他原树中其中一个祖先,在新树上的深度。

其实原因也很显然:凭什么这个节点能连到上面去而它没一个祖先能连上去……

因此设 dp 状态 fu,i 表示只考虑 u 及其子树,最小只向深度为 i 的祖先连边的方案数,则有 fu,i=jifv,j

最后将答案合并进 fn,0 即可。前缀和优化为 O(n2)

2. P10789 [NOI2024] 登山

3. CF1799H Tree Cutting

Part 4 状压 DP

1. P8292 [省选联考 2022] 卡牌

如果质数个数较小,只需大力容斥即可,用总方案减去所有不合法的方案:钦定覆盖 0 个质数 钦定覆盖 1 个质数 + 钦定覆盖 2 个质数……

但是质数个数很多,但又不算多,根据 NOI2015 寿司题经验,可以发现 43×47>2000,也就是说每一个数最多只有一个大于 43 的质数,所以考虑根号分治。

考虑只有大质数怎么做,那么直接枚举给出的卡牌序列里整除大质数 p 的个数 fp,然后如果要求被大质数 p 整除,那么这 fp 个卡牌不能全不选,2fp1,否则就放养,2fp

接下来只需要把第一段和第三段结合起来,即对每种不同的小质数集合都算一次大质数的答案,容斥即可。

2. CF1842H Tenzing and Random Real Numbers

最近更新