插入 DP 总结
插入 DP 总结
引
插入 DP 是一类非常巧妙的 DP,常用于计数、求概率、期望,也可用于求最值。具体地,它会用来求排列、划分相关信息等,这些排列、划分都有一定特征。
通常使用维护多个连续段信息的方法来解决。
状态
由于维护信息中通常有连续段个数这一维,且转移复杂不宜使用数据结构优化,导致其大小一般不会很大,在 \(O(n^3)\) 内解决居多。
所以通常记录的就是已插入的数个数,连续段个数,可能还有记录其余特殊性质的维。
做插入 DP 时尤其需要注意一些特殊条件,例如首段与尾端可能需要特殊处理,这些通常通过计入 DP 状态常数维来解决。
转移
插入 DP 转移式以复杂的分类讨论著称,如何有条理地列出插入 DP 转移方程?其实很简单。
插入 DP 的转移式一般分为三种:
- insert:插入新连续段。
- extend:扩展已有连续段。
- merge:合并已有连续段。
分类之后,只要将转移式清晰列出即可解决问题。
注意 2/3 两种情况需要判断连续段的数量,否则可能会出现问题。
例题
普通二维状态
AT_dp_t Permutation
这题严格来说不能算插入 DP,它没有插入最核心的特征——维护多个连续段。
较为基础,需要用前缀和优化,做到 \(O(n^2)\)。
AT_abc209_f [ABC209F] Deforestation
也是板子题。
CF1515E Phoenix and Computers
也是比较简单的模板题。插入 DP 做到 \(O(n^2)\)。
CF704B Ant Man
这题是少有的插入 DP 求最值贡献的题目,很不错的思维题,虽然有更优的贪心做法,但还是值得一写。
这里的连续段维护的是一段路径的连续段,注意与 \(S,T\) 有关的需要额外讨论。
[CEOI 2016] kangaroo
注意这题并没有拓展的情况,不能拘泥于转移范式中。
「GDOI2020模拟赛day1」Permutation
树上插入 DP 搭配组合数学、容斥,非常难的一题。
没时间了,自己看题解吧:【GDOI2020模拟4.4】Permutation (计数+树形.笛卡尔树dp+容斥): - Cold_Chair - 博客园 (cnblogs.com)(拜谢大佬)。
普通三维状态
UTS Open '21 P7 - April Fools - DMOJ utso21p7 - Virtual Judge (vjudge.net)
这道题在状态设计上相对于上面的略有拓展,但也并不难。
但是难的是它的转移式,很好的展现了插入 DP 分类讨论复杂的特点。
UTS Open '21 P7 - April Fools 题解 - Add_Catalyst - 博客园 (cnblogs.com)。
二维状态+贡献总和维
这类题目状态中带一个 \(m/k\),复杂度一般在 \(O(n^2m)\) 等,所以可能 \(m\) 会是 \(n\) 的数倍,这是一个特征。
CF626F Group Projects
插入 DP 模板题,三维的状态,多一维时间总和,复杂度 \(O(n^2k)\)。
[COCI 2021/2022 #2] Magneti
这题需要稍微和组合数学结合一下,但是本质其实相同,也是加一维记总距离,复杂度 \(O(n^2l)\)。
[JOI Open 2016] 摩天大楼 / Skyscraper
这题有一个比较套路的 trick——水淹笛卡尔树:将值排序之后再逐个插入,就可以做到避免用拆贡献,因为拆贡献导致的值域时增时减会使 DP 状态开不下。
以及这题还记了一维或者两维的常数维来表示两边的是否结束,这很重要,很容易被忽略!!!
P2612 [ZJOI2012] 波浪
首先注意到 \(M\) 的范围是个诈骗,其实最多只有 \(O(n^2)\) 级别。
然后把概率变成求方案数,那么就和上一题无异,但是它还卡精度,剩下的就看题解吧……
这题与上一题不同的是,值域较小,不用那个 trick 也没有多大差别。
总结
插入 DP 的题目不多,一旦遇到,一定非常麻烦,也比较套路,耐心求解一定会有结果(但是可能没有时间)。

浙公网安备 33010602011771号