DP特训总结(题解/游记篇)

· · 个人记录

技巧之类的东西挂在这里了。

这里就主要写像题解/游记一样的东西了。

没写完。

A-kangaroo

评分:7+2(计数题额外评分)/10。

令人谔谔的题。被张老师评价为“第一次看到很难独立想出来”的题。容易想到状态 dp_{i,j,k} 表示第 i 步在草丛 j 并且方向为 k 的方案数。发现会算重并且很难去重。但是呢在评讲之前还是一直在想怎么去重,没有往状态设计方面想得很深。

事实上这道题考察的就是对于状态的设计。也可以称这种 DP 方式为 “插入DP”,看起来就像是区间 DP 的一种特殊情况。可以发现当我们画出一个步数-路径图像,合法的方案一定是一个 多重 M 形。对于这种图像有一个特征,就是我们可以找到其中的最高点并将其划分为两个不同的 多重 M 形(我们把单点也看做一个 多重 M 形)。那么我们就可以反过来,每次操作时插入一个最大值并合并两个 多重 M 形。那么状态就很显然了,dp_{i,j} 表示当前插入了数 i 并且有 j多重 M 形 的方案数,转移可以开一个新的单点 多重 M 形,也可以合并两个 多重 M 形,对于 st 多讨论一点,最后输出 dp_{n,1} 即可。

很新颖的状态设计,之前好像有见过类似的东西,但是没怎么搞懂。现在看过一遍后掌握这个 插入DP 就可以了。

B-哈利波特与死亡圣器

评分:7/10。

榜貌似被带歪了啊。

不是很难的一道题,想到二分过后就比较容易了?虽然还是想了很久。

而且前面还放过了假做法,令人感慨。不过后面还是写了正解的。思路就是 check 时统计每棵子树需要多少外面的帮助,简单转移即可。

C-Chase

评分:8/10。

比较好的题目,让我知道了求树上路径相关问题不仅可以换根还可以直接 DP。 UPD:刚刚才写完换根。真的很恶心。最开始自己在写,然后怎么样也调不出来,发现贡献算的、得有问题。只好参考了下题解的换根写法,贡献算得比我简单很多,但是常数挺大的。待会再去看看 LCA 处合并的做法。 ### [E-Neko Rules the Catniverse (Large Version)](https://codeforces.com/contest/1152/problem/F2) 评分:8+2(计数题额外评分)/10. 很好的一个题。发现要求序列没有重复元素且序列长度比较小,可以做一个类似于 **插入DP** 的东西(好像就是插入 DP 来着)。不过这次我们不需要块数的信息,只需要有关转移系数的信息,发现 $m \leq 4$,那么可以从 $1$ 到 $n$ 枚举每个数 $i$ 是否可以插入,插入时转移系数就是有多少个位置可以插入。序列首没有任何限制,是肯定可以插入的。对于其它空位,要满足空位前的数加上 $m$ 大于等于 $i$,也就是只有 $i-m$ 到 $i-1$ 的数满足条件。状压这些数是否出现,系数当然就是其 `popcount` 加 $1$。 $n$ 很大,矩阵快速幂优化递推即可。 DP 特训里有两道插入 DP,而且我都比较喜欢,它们让我学到的东西蛮多的。感觉计数能力稍微提升了那么一点点。