动态规划练习一 04:公共子序列
2017-04-12 08:34
246 查看
描述
我们称序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, ..., ik >,使得对j = 1, 2, ... ,k, 有xij =
zj。比如Z = < a, b, f, c > 是X = < a, b, c, f, b, c >的子序列。
现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。
输入
输入包括多组测试数据。每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列。两个字符串之间由若干个空格隔开。
输出
对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。
样例输入
样例输出
来源
翻译自Southeastern Europe 2003的试题
这道题为动态规划问题,因为要比较两串字符,我们可以用一个二维数组下标分别表示两串字符的下标,用数组数表示到这两个下标的最长公共字符串,这样问题就容易解决了。
源代码如下:
需要注意的是不要让f[i-1][j-1]越界,所以for循环从1开始,字符串下标用i-1跟j-1表示,这样问题就解决了 。
我们称序列Z = < z1, z2, ..., zk >是序列X = < x1, x2, ..., xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, ..., ik >,使得对j = 1, 2, ... ,k, 有xij =
zj。比如Z = < a, b, f, c > 是X = < a, b, c, f, b, c >的子序列。
现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找到一个最长的序列Z,使得Z既是X的子序列也是Y的子序列。
输入
输入包括多组测试数据。每组数据包括一行,给出两个长度不超过200的字符串,表示两个序列。两个字符串之间由若干个空格隔开。
输出
对每组输入数据,输出一行,给出两个序列的最大公共子序列的长度。
样例输入
abcfbc abfcab programming contest abcd mnp
样例输出
4 2 0
来源
翻译自Southeastern Europe 2003的试题
这道题为动态规划问题,因为要比较两串字符,我们可以用一个二维数组下标分别表示两串字符的下标,用数组数表示到这两个下标的最长公共字符串,这样问题就容易解决了。
源代码如下:
#include<bits/stdc++.h> using namespace std; int main() { char a[201],b[201]; int i,j,x,y; while(cin>>a>>b) { int f[201][201]={0},max=0; x=strlen(a); y=strlen(b); for(i=1;i<=x;++i) for(j=1;j<=y;++j) { if(a[i-1]==b[j-1])f[i][j]=f[i-1][j-1]+1; else { if(f[i-1][j]>f[i][j-1])f[i][j]=f[i-1][j]; else f[i][j]=f[i][j-1]; } } for(i=1;i<=x;++i) for(j=1;j<=y;++j) { if(f[i][j]>max)max=f[i][j]; } cout<<max<<endl; } }
需要注意的是不要让f[i-1][j-1]越界,所以for循环从1开始,字符串下标用i-1跟j-1表示,这样问题就解决了 。
相关文章推荐
- 动态规划练习-4(公共子序列)
- 动态规划练习——公共子序列
- [ACM_动态规划] UVA 12511 Virus [最长公共递增子序列 LCIS 动态规划]
- 最长递增、递减子序列(导弹拦截问题)动态规划练习
- 动态规划 最常公共子序列问题
- 动态规划 - 最长公共子序列 - 最长公共子串 - 最长不重复子串 - 最长递增子序列 - 最长回文子串
- 利用动态规划找出最长公共单调递增子序列
- poj-2806-公共子序列-C语言-动态规划
- 动态规划求一道 类最长递增公共子序列
- hud1151 动态规划 最大的公共子序列
- 最大公共子序列,最大子段和(动态规划)
- 动态规划求一道 类最长递增公共子序列
- 最大公共子序列--动态规划
- 动态规划-公共子序列
- 最长连续公共子序列---动态规划
- 动态规划 最长公共子序列 LCS,最长单独递增子序列,最长公共子串
- 最大子序列、最长连续公共子串(连续)、最长公共子序列(动态规划)
- 动态规划求最长公共序列
- java 动态规划最大公共子序列问题
- NOI 1808:公共子序列(C++) 动态规划