动态规划题单
记录一些 DP 里常用的优化方法。
CF1453F Even Harder
可以对最后的路径 DP,\(i \to j\) 的代价是他们俩之间之间 \(p + a_p \leq j\) 的 \(p\) 的个数,且对于 \(i \to j \to k\) 要满足 \(i + a_i < k\),那么 \(O(n^3)\) 的做法就呼之欲出了:每次枚举 \(i, j, k\),做 \(f_{i, j} + w(j, k) \to f_{j, k}\) 转移,答案是 \(f_{?, n}\)。
\(i \to j \to k\) 的转移中,之所以要记录 \(i\),是因为它对于 \(k\) 有限制。因此我们想要对于 \(k\) 快速找到所有 \(i + a_i < k\) 的 \(i\) 的最小 \(f_{i, j}\)。这个 \(i + a_i\) 是个定值,因此不妨把 \(f_{i, j}\) 这个状态修改为 \(f_{p, j}\),其中 \(p\) 记录的就是 \(i + a_i\) 这一类的限制。这样用前缀 \(\min\) 就可以快速找到了。
实际上,这种思想是一次转移有多步时的常用优化方式。即分析 \(i, j, k\) 之间的相互影响,通过分别处理 \(i \to j\) 和 \(j \to k\),使得复杂度从相乘变成并列。
AGC013D Piling Up
转化成格路计数:从 \((0, 0)\) 开始,每次向右上或右下走一步,总共走 \(m\) 步,要求经过的点 \(y\) 坐标极差不超过 \(n\),求方案数。
这个极差可能是 \((y = 0, y = n), (y = -1, y = n - 1), \dots, (y = -n, y = 0)\) 产生的,枚举这些情况再 DP 复杂度就是 \(O(n^2m)\)。但是我们可以换参考系,假设这个极差的限制不动,但是起点可以是 \((0, 0), (1, 1), \dots\),这样就可以一次 DP 解决。计算完后令 \(n \leftarrow n - 1\) 再算一次,容斥掉本质相同的情况即可。复杂度 \(O(nm)\)。
AGC033D Complexity
这道题的朴素 DP 状态是 \(O(n^4)\)。但是 DP 的值域较小(\(\O(\log n)\) 量级),因此交换定义域和值域,复杂度转化为 \(O(n^3\log n)\)。
【7.25NOIP模拟】酒杯
当 DP 的结构具有嵌套的相似结构时,考虑使用倍增优化 DP。

浙公网安备 33010602011771号