计算重复(倍增优化dp)

该博客讨论了一种使用动态规划和倍增算法来解决的问题,即找到最大的整数m,使得通过拼接n2个s2字符串可以构成n1个s1字符串的子序列。通过构建一个无限长的s1字符串序列,并计算以每个s1字符为起点,包含不同数量s2的最短路径,最后使用倍增技巧来确定符合条件的最大m值。
摘要由CSDN通过智能技术生成

定义 conn(s,n)conn(s,n) 为 n 个字符串 s 首尾相接形成的字符串,例如:

conn(“abc”,2)=”abcabc”

称字符串 a 能由字符串 b 生成,当且仅当从字符串 b 中删除某些字符后可以得到字符串 a。

例如“abdbec”可以生成“abc”,但是“acbbe”不能生成“abc”。

给定两个字符串 s1 和 s2,以及两个整数 n1 和 n2,求一个最大的整数 m,满足conn(conn(s2,n2),m)能由 conn(s1,n1)生成。

输入格式

输入包含多组测试数据。

每组数据由2行组成,第一行包含s2,n2,第二行包含s1,n1。

输出格式

对于每组数据输出一行表示答案m。

数据范围

s1 和 s2 长度不超过100,n1 和 n2 不大于 106。

输入样例:

ab 2
acb 4
acb 1
acb 1
aa 1
aaa 3
baab 1
baba 11
aaaaa 1
aaa 20

输出样例:

2
1
4
7
12

题意:求最大的整数m,使得(n1个s1) 的子序列中能找到(m个n2个s2),即:(m个n2个s2)能由(n1个s1)生成。

思路:

构造一个由无限个s1依次首尾相连的串

f[i][j]表示以s1[i]为起点,包含2^j个s2的最短的一段的步数  (因为要使个数最多,所以每一段要尽可能短)

因为在求个数时,需要找到每次求完一段完成的终点作为下一次

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值