DP 选讲(csy)
模拟对数空间的图灵机
基本概述
问题一般分类为判定型,构造型,计数型 \(\dots\)
可以构造模拟对数空间的图灵机。\(M(x,y)\),其中 \(x\) 是输入,\(y\) 是需要判定的东西。计数题就是判定有多少个 \(y\) 合法,或者是统计 \(y\) 的容斥系数。比如说我们在统计序列数量的时候,传入的 \(y\) 就是需要被判定的序列,我们在自动机内部需要设计一个算法判定其是否合法。这个算法的空间复杂度如果 \(\le O(\log n)\),就可以在多项式时间复杂度内解决。
只有在工作区的空间复杂度才计入复杂度,输入和输出的一些是不算的,数字是以二进制形式表示(所以你如果开一个值域为 \(V\) 的变量,那么就是 \(\log V\))。外层 DP 的时候就要记录内层状态,假设内层状态大小为 \(|s|\),外层状态的大小就是 \(2^{|s|}\),所以只有在空间为 \(\log\) 级别的时候才能有多项式做法。
例子
非讲课内容,但是我觉得 ARC074E 这题非常适合当作例子。
考虑传入序列 \(y\),我们如何判定其是否合法。扫描 \(y\),变量 \(i\),当前颜色位置在 \(i\),另外两个颜色位置在 \(j,k\),通过这三个变量我们就可以快速判定是否符合区间。空间复杂度 3\log n。所以状态数就是 \(2^{3\log n}=n^3\)。
通过判定方法,我们就可以很快知道了 dp 要记录当前枚举到了序列的第几个位置,上一个不同的颜色的位置,以及上一个与这两个颜色都不同的颜色位置。然后就解决了本题。
本质是用最小的状态数记录能刻画当前 DP 目标的东西。 转化为图灵机能方便我们思考。
应用
AGC013D Piling Up
给定一个颜色序列,如何判定合法?转化为走格子,遇到黑色向右上,遇到白色向右下。这个路径要求 \(y\) 坐标极差不超过 \(n\),记录循环变量 \(i\),坐标 \(y\) 和最大最小 \(y\),这是 \(4\log n\) 的。但是其实只需要记录当前点到最大最小 \(y\) 的距离就行了。这样子是 \(3\log n\) 的空间,所以 dp 是 \(O(n^3)\) 的。
其实我们直接传入 \(M(x,y,z)\),多了一个 \(z\) 表示下界,注意到多个下界是同构的。于是就可以做到 \(O(n^2)\) 的了。
局限性
可以发现上述方法只能做一个按照线性顺序的 dp,无法求解区间 dp,树形 dp 之类的。可以用双射拆分。

浙公网安备 33010602011771号