Codeforces Round #646 F - Rotating Substrings (1363F)

本文探讨了如何求解在给定的两个等长字符串 a 和 b 之间,通过旋转子串最少次数来使 a 变成 b 的问题。首先分析了旋转操作的本质,然后讨论了可行性条件和最优解的推导。提出了动态规划解决方案,包括递推公式和边界条件,并解释了每个状态的物理意义。最后,介绍了利用记忆化搜索和预处理前缀和来实现 O(n^2) 复杂度的编码方法。
摘要由CSDN通过智能技术生成

Rotating Substrings

题意

给定两个等长的字符串 a , b a,b a,b (长度至多2000),对第字符串 a a a 可以做如下操作:将一个字串向右旋转一格,问最少几次操作将其变成 b b b 字符串。

观察

旋转操作过于丑陋,事实上观察容易发现,对区间 [ l , r ] [l,r] [l,r] 旋转,等价于将 a r a_r ar 移到 a l a_l al 前面,此外没有影响。

分析

先考虑可行性,显然如果两个字符串各个字符数量不一致则无解,反之一定有解。

再分析如何求解最优解。事实上旋转操作可以视为将一个元素挑出来,移到前面的任何位置。可以发现,元素只能向前移,不能向后移,所以后面的元素一定先于前面的元素确定,考虑从后向前推。

不失一般性,考虑特定的两位 a i , b j a_i,b_j ai,bj , 假设其后的内容已经被确定,考虑完成之前的内容的匹配需要的次数,记为 d p ( i , j ) dp(i,j) dp(i,j),那么有如下三种情况

  • d p ( i , j ) = d p ( i − 1 , j ) + 1 dp(i,j) = dp(i-1,j)+1 dp(i,j)=dp(i1,j)+1 :即花费 1 1 1 的代价将 a i a_i ai 移动到之前某个位置
  • d p ( i , j ) = d
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值