【CF 682D】String
来源:互联网 发布:秦皇岛网络推广 编辑:程序博客网 时间:2024/06/03 19:45
Description
有两种字符串S,T。长度分别为n,m。现在需要在S里面有序地选出k个子串,且在T中出现的顺序与这k个子串的顺序相同。问这k个子串最大的长度和
Solution
动态规划
求最优解,还是字符串上的,这种题一看就知道是DP。
构造状态,很容易想到f[i][j][k],i表示匹配到S的第i个点,j表示匹配到T的第j个点,k表示分了k段。
然后,比赛的时候就没往下想了,每次不知道当前的串是否匹配完,还需要枚举上一次的位置,速度也只能过30%。
再往下想一想
我们可以用一个状态来存储当前这个串到底有没有匹配完,那么DP再加一维,就变成f[i][j][k][0,1]表示第i位和第j位是否成功匹配,那么转移就很显然了。
Code
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;const int maxn=1007;int i,j,k,l,t,n,m,ans,kk;int f[maxn][maxn][11][2];char s[maxn],st[maxn];int main(){ freopen("string.in","r",stdin); freopen("string.out","w",stdout); scanf("%d%d%d",&n,&m,&kk); scanf("%s",s+1);scanf("%s",st+1); fo(i,1,n){ fo(j,1,m){ fo(k,1,kk){ f[i][j][k][0]=max(f[i-1][j][k][1],f[i][j-1][k][1]); f[i][j][k][0]=max(f[i][j][k][0],max(f[i-1][j][k][0],f[i][j-1][k][0])); if(s[i]==st[j]){ f[i][j][k][1]=f[i-1][j-1][k-1][0]+1; if(s[i-1]==st[j-1]){ f[i][j][k][1]=max(f[i][j][k][1],f[i-1][j-1][k][1]+1); } } } } } printf("%d\n",max(f[n][m][kk][0],f[n][m][kk][1]));}
1 0
- 【CF 682D】String
- CF 119D String Transformation(KMP,哈希,枚举,各种优化)
- 构造(Recover the String,cf 709D)
- cf 709D Recover the String(构造题)
- CF 779D String Game 二分,贪心匹配字符串
- 【Codeforces 682D】【String】
- CF AIM Tech Round 3 (Div. 2) D - Recover the String
- CF Round #423 Div. 2 C. String Reconstruction D. High Load 【思维】
- CF D. Buses
- D. Ball CF
- CF 148D
- CF 173D-- Palindromes
- CF 228D Zigzag
- CF 79D. Password
- CF 214D
- CF 109D
- CF 109D 模拟
- CF 85D
- smartgit上传项目到github,smartgit序列号问题
- Struts2的Action向JSP传输List集合并且将数据显示在页面上
- Kafka文件存储机制那些事
- Jpanel或Jframe添加键盘监听无效
- redis与memcached的区别
- 【CF 682D】String
- target,currentTarget和this三者的区别
- Git系列一之git简介
- 关于eclipse中配置svn插件,亲测有效。
- 根据两点经纬度计算两点距离...工具类
- QOS-7 总结及WAN链路有效性
- 5-13 畅通工程之最低成本建设问题 (30分)(这个是补上去的7月5号)
- Django配置出错时候的模板
- 标杆