自动机上 dp

板子:Hero meet devil

考虑我们做 lcs 的过程是一个二维 dp 数组,那么我们实际上可以把第二维看成一个长为 \(k\) 的向量,进而抽象成自动机的结点,第一维看成不停读入字符,随之向量改变,这样就可以抽象成一个自动机上走路问题了,这里状态数的估计是因为观察我们的转移方程,向量内相邻两个数至多差 \(1\),所以差分完是 01 数组,总计是 \(O(2^k)\) 的,实际上可以把所有从初始状态可达的都搜出来,这样就只有 \(6000\) 多。

小 N 的独立集

暴力做法是直接记录钦定 \(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\) ,这样就可以转移了。

Median Replace

重要的结论是有连续三个 \(0\) 消掉一定是优的,一个 \(0\)\(1\) 加上一个其他随意的数,操作相当于留下了其他随意的数,在不能操作连续的 \(0\) 的时候操作这个一定不劣。

这种相消的东西尝试用栈去考虑:

加入 \(0\):如果有连续的就消去,否则先放放。

加入 \(1\):如果栈顶是 \(0\) 消去一定不劣,如果有连续三个 \(1\) 那么串无论之后是什么都一定合法(后面最多剩 \(2\)\(0\))。

两种数的数量都不超过二,手模出自动机走路就行了。

posted @ 2025-07-10 21:57  hdkk  阅读(16)  评论(0)    收藏  举报
//雪花飘落效果