2025 暑假 DP 专题
CF922E Birds / Птички
状态的设计比较特别。我们要求的是召唤的鸟的最大值,但是我们发现如果这样设置,题中的魔法值不好体现在状态中。于是采取另一种思路,把召唤的鸟的数量设在状态中,即设置 \(f_{i,j}\) 表示走到第 \(i\) 棵树,此前已经召唤了 \(j\) 只鸟,此时剩余的魔法值的最大值。实际上,这里的 “最大值” 承担了验证状态是否存在的作用。若最开始设置 \(\forall f_{i,j}=-1\),边界为 \(f_{0,0}=W\),我们最后只需找到使 \(f_{n,j}\ne-1\) 的最大的 \(j\) 即可。
转移是容易的,刷表则有 \(f_{i+1,j+k}=\max\limits_{0\le k\le c_i,f_{i,j}-\mathit{cost}_i\times k\ge0}\big\{\min(f_{i,j}-\mathit{cost}_i\times k+X,W+(j+k)\times B)\big\}\)。
CF494C Helping People / Помощь нуждающимся
首先分清楚,\(E(\max a_i)\ne\max E(a_i)\),不然一个差分就过去了。
建树的技巧应当积累,因为题目中给了区间没有相交关系,于是考虑再加上一个范围 \([1,n]\)、概率为 \(0\) 区间,这样所有区间可以形成一个树结构。建树时只需把区间按左端点从小到大、右端点从大到小的顺序排序,然后对于每个区间向前找到第一个被包含的区间并向其连边即可。
与其直接 DP 期望,不如 DP 概率,因为这题中最后的最大值一定在 \([\max a_i,\max a_i+q]\) 之间,算出概率挨个乘以值即可求出期望。于是建完树之后,设 \(f_{u,i}\) 表示节点 \(u\) 最大值小于等于 \(i+\mathit{maxu}\) 的概率,转移即为
一定要注意边界问题。显然,当 \(i=0\) 时我们只需要加号后面的部分,同时所有转移方程中的第二维都需要对 \(q\) 取 \(\min\),否则会越界。另外,此题较好的写法是在外层枚举 \(i\),然后在里层枚举 \(u\) 的儿子,比开临时数组保险。
CF1628D1 Game on Sum (Easy Version) / Игра на сумму (Легкая версия)
连着几天碰到博弈论,还是很有意思的。
不妨先讨论 \(n=2,m=1\) 的情况,不难发现 Alice 取值在 \(k/2\) 处最优。那么我们考虑一个 DP:设 \(f_{i,j}\) 表示有 \(i\) 个回合、\(j\) 次必须加时的答案。不难发现边界条件为 \(f_{i,0}=0,f_{i,i}=ik\)。接下来最重要的是转移,因为博弈论是两个人都取最优解,所以一般的解决方法是先保证一个人最优,再取另外一个人的最优情况。我们不难想到,对于 Alice 选的一个数 \(x\),Bob 要么加要么减,如果加就可以消耗一次必须加的次数。因为 Bob 肯定会取两种情况的较小值,所以有
然后考虑 Alice 把 \(x\) 取在多少时上面那个式子的值最大。不难得到当 \(x=\dfrac{f_{i-1,j}-f_{i-1,j-1}}2\) 时取到,所以上面的转移方程最终形式就是
题目保证了 \(\sum n\le2000\),所以每组数据都直接转移即可。
CF285E Positions in Permutations / Позиции в перестановке
看到恰好想到二项式反演转为钦定,接下来考虑求出 \(F(m)\) 表示至少有 \(m\) 个完美位置的方案数。想到设 \(f_{i,j}\) 表示前 \(i\) 个位置有 \(j\) 个完美位置的方案数,但是这样不好转移,因为一个位置 \(i\) 是否完美取决于数字 \(i-1\) 和 \(i+1\) 是否已经被放好了,如果已经被放好了就不能作为完美位置。于是增设两位分别表示数字 \(i\) 和数字 \(i+1\) 是否被放好了,这样状态变成 \(f_{i,j,0/1,0/1}\)。分类讨论转移:
- 位置 \(i\) 是完美位置,将数字 \(i-1\) 放到位置 \(i\):(这里分类讨论了数字 \(i\) 有没有被放好的两种情况,下文同理)
- 位置 \(i\) 是完美位置,将数字 \(i+1\) 放到位置 \(i\):
- 位置 \(i\) 不是完美位置:
需要理解好位置和数字的区别,以及位置 \(1\) 和 \(n\) 需要特殊处理。然后就不难得出 \(F(i)=(f_{n,i,0,0}+f_{n,i,1,0})(n-i)!\),因为别的位置可以乱放。然后用二项式反演得到 \(G(m)=\sum_{i=m}^n(-1)^{i-m}\binom imF(i)\) 就是答案了。
CF1614D1 Divan and Kostomuksha (easy version) / Divan и Костомукша (простая версия)
脑子需要转一下。
显然重排 \(a\) 的这个操作是很难实现的,猜测 DP 状态只和值域相关。设 \(f_i\) 表示全局 \(\gcd\) 为 \(i\) 时的答案。但是我们不知道怎么转移。
发现:\(\gcd\) 序列一定单调不升,且前者一定是后者的倍数。
发现了这个性质之后我们就能够转移 \(f_i\)。具体地,\(f_i\) 初始值为 \(i\times\text{num}(i)\),其中 \(\text{num}(i)\) 为给定序列中 \(i\) 的倍数的个数,然后枚举 \(i\) 的所有倍数 \(j\),在 \(f_j+\big(\text{num}(i)-\text{num}(j)\big)\times i\) 中和 \(f_i\) 取最小值即可。含义为,把这些是 \(i\) 的倍数但不是 \(j\) 的倍数的数放在是 \(j\)
的倍数的数的后面,每一个数都会提供 \(i\) 的贡献。
考虑这样维护的正确性。因为 \(\gcd\) 序列一定是单调不升的,且我们倒序枚举 \(i\),所以当我们枚举 \(i\) 的倍数 \(j\) 时,\(f_j\) 所维护的范围一定在 \(f_i\) 所维护的范围之前,所以这样维护一定有正确性。
至于复杂度,在一定值域内枚举一个数的所有倍数易知是 \(O(V\log V)\) 的,可以通过 D1。
CF838C Future Failure / Будущий проигрыш
怎么又是博弈论。
既然是博弈论,那就观察博弈的过程。注意到,若初始状态的字符串共有偶数种排列方式,先手一定是必胜的。简单证明,若先手删除字符可以使后手必败,则先手必胜;否则先手只需重排一次字符串,此时后手删除字符不能使先手必败,而如果继续重排,因为字符串有偶数种排列方式,所以一定是后手先重排不了,所以先手必胜。
那么,如果字符串只有奇数种排列方式,先手只能删除字符。我们又注意到,删除一个字符后的字符串,排列方式也只可能有奇数种。简单证明,设第 \(1\) 到 \(k\) 种字符各有 \(a_1\dots a_n\) 个,那么原字符串的排列方式就有 \(\frac{n!}{(\prod a_i)!}\) 种,删去一个字符相当于乘以一个 \(\frac{a_i}n\)。因为原字符串的排列方式为奇数,所以 \(n!\) 和 \((\prod a_i)!\) 中因子 \(2\) 的次数应当是相等的。那么 \(\frac{a_i}n\) 中 \(a_i\) 所含的 \(2\) 的次数应当小于等于 \(n\) 中所含 \(2\) 的次数。所以 \(2\) 的次数不会增加,所以删去一个字符后排列方式还是只能有奇数种。
那么在这种情况下,\(n\) 为奇数就是先手必胜的。
综上,我们可以得到:若 \(\boldsymbol n\) 为奇数,先手一定必胜;若 \(\boldsymbol n\) 为偶数,则先手必胜当且仅当原字符串有偶数种排列方式。
所以当 \(n\) 为奇数时直接输出 \(k^n\) 退出即可。接下来的任务是当 \(n\) 为偶数时计算有多少种字符串的排列方式为偶数。方法同样是从 \(\frac{n!}{(\prod a_i)!}\) 这个式子入手,字符串排列方式为偶数说明 \(n!\) 中 \(2\) 的次数大于 \((\prod a_i)!\) 中 \(2\) 的次数。考虑到大于不好处理,考虑计算出排列方式为奇数的方案数,也就是二者中 \(2\) 的次数相等的情况,再用总的 \(k^n\) 减去即可。
我们再一次注意到:\(n!\) 中 \(2\) 的次数等于 \(\sum\limits_{i=1}^\infty\lfloor\frac n{2^i}\rfloor\)。所以这个判定条件就变成
我们第四次注意到,有引理 \(\lfloor\frac ax\rfloor+\lfloor\frac bx\rfloor\le\lfloor\frac{a+b}x\rfloor\)。所以上面那个式子说明,如果把 \(n\) 和 \(a_i\) 都写成二进制形式,那么若 \(n\) 中某一位是 \(1\),一定有且仅有一个 \(a_i\) 对应位上是 \(1\);若 \(n\) 中某一位是 \(0\),那么所有的 \(a_i\) 的对应位都必须是 \(0\)。
我们发现可以 DP 算出这一部分方案。设 \(f_{i,s}\) 表示考虑到第 \(i\) 种字母、当前的 \(n\) 还剩下 \(s\) 时,\(\prod\frac1{a_i!}\) 的和。转移时枚举 \(s\) 的子集 \(j\) 进行转移,有
最后统计
即可。

浙公网安备 33010602011771号