题意简述
给定一个01
串 $S$,每次操作把最前面的两个字符删除,并将其中一个插入回串中。求能获得的串的个数,取模。
$|S|\le 300$。
主要思路
考虑这个过程,不妨设 $(i, c_0, c_1)$ 这个状态表示目前串最长的等于 $S$ 的后缀的子序列长度为 $|S| - i$,除此以外分别多出 $c_0, c_1$ 个0
,1
。
我们设 $tr(i, c_0, c_1)$ 为这个状态是否可达,$dp(i, c_0, c_1)$ 为这个状态的方案数。
(初始 $tr(0, 0, 0) = 1$,$dp(n, 0, 0) = 1$,一个要顺着一个要倒着转移。)
然后转移非常多情况要讨论,都扔到注释里了。都是力气活……
总之最后复杂度就是 $O(|S|^3)$ 了。
参考代码
1 |
|