P6758 [BalticOI2013] Vim
题目描述
给定一个长度为 N N N 的字符串 S S S,Victor 的目标是将其中的 e
全部删除,而不删除其他字符。
Victor 使用 Vim
来解决这个问题。
然而,Victor 并不熟悉 Vim
,他只知道这里面的三个指令:
x
:删除光标处的字符,光标位置不变,不可以在最后的字符处使用这个命令。h
:将光标向左移动一格,如果光标位于第一个位置,则光标不动。f
:其后接一个字符 c c c,其将会将光标移至其右边的第一个字符 c c c, c ≠ c\not = c=e
。
请计算将其中的e
全部删除,而不删除其他字符的最小按键数。
tips: \text{tips:} tips:一次 f f f操作代价是 2 2 2,一开始看成 1 1 1得到了一些假结论,给 A A A组口胡时锅了
Solution
不难想到一个暴力 d p dp dp,设 f i , j f_{i,j} fi,j表示前 i i i个位置的 e e e都已经被删了,当前光标跳到了位置 j j j的最小代价,然后就可以做到 O ( n 2 v ) O(n^2v) O(n2v)的复杂度,其中 v v v为字符集大小
但是这不能接受,这时候就要引入一个叫做线头 d p dp dp的东西
我们首先把字符中的 e e e都给去掉,删掉一个 e e e有两步操作,从后面那个字符移过来,删掉它,所以删掉一个 e e e需要代价 2 2 2
那么剩下的字符之间我们看作有一些边,如果有两个相邻字符之间原本是有 e e e的,那这条边我们称之为
必经边,设 n d i nd_i ndi表示 i − 1 , i i-1,i i−1,i这条边是否是必经边
图是从这里嫖的LOJ2687 BalticOI2013 Vim 线头DP
这是我们移动时的大致形态,观察可以得出,一条边要么被一条从后面过来的 f f f操作经过一次,要么被 f f f操作一次,然后 h h h回去,再 f f f过去经过 3 3 3次,必经边是必须被经过 3 3 3次的
根据这个我们就可以设计出 d p dp dp,设 f i , j f_{i,j} fi,