CF1701E 题解

· · 题解

思路

手玩几组数据可知:

可以把 s 分成前、中、后三部分,然后 dp。设 f_{i,j,0/1/2} 表示当前处理到 s 的第 i 个字符,跟 t 中前 j 个字符匹配,当前光标在前/中/后部分的最少移动次数。

转移:

f_{i,j,0} \gets \min(f_{i,j,0},f_{i-1,j,0}+2) f_{i,j,2} \gets \min(f_{i,j,2},f_{i-1,j,2}+1)

注意这里没有 f_{i,j,1} 的转移,是因为中部分的字符不能修改。

f_{i,j,0} \gets \min(f_{i,j,0},f_{i-1,j-1,0}+1) f_{i,j,1} \gets \min(f_{i,j,1},f_{i-1,j-1,1}) f_{i,j,2} \gets \min(f_{i,j,2},f_{i-1,j-1,2}+1) f_{i,j,1} \gets \min(f_{i,j,1},f_{i,j,0}) f_{i,j,2} \gets \min(f_{i,j,2},f_{i,j,1},f_{i,j,0})

注意最后还要加上按 home 的操作,即操作次数为 f_{n,m,2}+1

由于此题卡空间,所以要用滚动数组优化。

代码

code