P6758 [BalticOI2013] Vim

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 i1,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,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值