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\) 不变可以优化一些常数。

代码喵

posted @ 2026-07-22 16:06  CuteNess  阅读(4)  评论(0)    收藏  举报