自动机上 dp
考虑我们做 lcs 的过程是一个二维 dp 数组,那么我们实际上可以把第二维看成一个长为 \(k\) 的向量,进而抽象成自动机的结点,第一维看成不停读入字符,随之向量改变,这样就可以抽象成一个自动机上走路问题了,这里状态数的估计是因为观察我们的转移方程,向量内相邻两个数至多差 \(1\),所以差分完是 01 数组,总计是 \(O(2^k)\) 的,实际上可以把所有从初始状态可达的都搜出来,这样就只有 \(6000\) 多。
暴力做法是直接记录钦定 \(u\) 选或不选的最大独立集和,这样是 \(n^4\) 大概,过不了,但是我们可以优化状态定义,设 \(f_{u,0}\) 为强制钦定不选的最大独立集和,\(f_{u,1}\) 为无限制的独立集和,那么 \(f_{u,1} \ge f_{u,0}\) 并且 \(f_{u,1}-f_{u,0}\le val_u\) ,这样就可以转移了。
重要的结论是有连续三个 \(0\) 消掉一定是优的,一个 \(0\) 和 \(1\) 加上一个其他随意的数,操作相当于留下了其他随意的数,在不能操作连续的 \(0\) 的时候操作这个一定不劣。
这种相消的东西尝试用栈去考虑:
加入 \(0\):如果有连续的就消去,否则先放放。
加入 \(1\):如果栈顶是 \(0\) 消去一定不劣,如果有连续三个 \(1\) 那么串无论之后是什么都一定合法(后面最多剩 \(2\) 个 \(0\))。
两种数的数量都不超过二,手模出自动机走路就行了。

浙公网安备 33010602011771号