uoj353 新年的代码
给定两个仅包含 0/1/2 的字符串 \(S,T\)。
每次操作可以选择 \(S\) 上的相邻两个位置:
- 若其值相同,则可将其变成两种不同的新颜色,即
00 -> 12/21。 - 若其值不同,则可将其变成一种不同的新颜色,即
12/21 -> 00。
试问最少要多少次操作将 \(S\) 变为 \(T\)。
\[n\le 5\times 10^5
\]
我们发现操作只会影响相邻的两个位置,因此不难设计出 dp:
\(dp_{i,j,k}\) 表示当 \(S_i\) 为 \(j\) 时,经过至少多少次在 \([0,i)\) 上的操作可以使得 \(S'[0,i)=T[0,i)\),且 \(S'_i=k\)。
转移考虑枚举 \(i,j,k\),以及前一个数的状态 \(a,b\),以及中间状态 \(p\)。令 \(f(a,b,c,d)\) 表示将相邻的 ab 操作为 cd 的次数。
则有 \(dp_{i,j,k}\leftarrow dp_{i-1,a,b}+f(s_{i-1},j,a,p)+f(b,p,t_{i-1},k)\)
时间复杂度 \(\mathcal O(3^5n)\),通过注意到操作前后之和 \(\bmod 3\) 不变可以优化一些常数。
本文来自博客园,作者:CuteNess,转载请注明原文链接:https://www.cnblogs.com/CuteNess/p/21785377
浙公网安备 33010602011771号