动态规划练习——公共子序列
2017-04-20 21:38
155 查看
题目要求:
我们称序列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的子序列。
题目思路:
设c[i][j]代表包含X的第i个元素与Y所得的最大公共子序列,状态转移方程:如果a[i-1]=b[i-1],c[i][j]=c[i-1][j-1]+1;否则c[i][j]=max{c[i][j-1],c[i-1][j]};求c[i][j]的最大值。
细节处理:
定义字符数组a,b,利用cin输入,分别求a,b的长度作为循环边界。
我们称序列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的子序列。
题目思路:
设c[i][j]代表包含X的第i个元素与Y所得的最大公共子序列,状态转移方程:如果a[i-1]=b[i-1],c[i][j]=c[i-1][j-1]+1;否则c[i][j]=max{c[i][j-1],c[i-1][j]};求c[i][j]的最大值。
细节处理:
定义字符数组a,b,利用cin输入,分别求a,b的长度作为循环边界。
#include<bits/stdc++.h> using namespace std; int max(int x,int y) { if(x<y)return y; else return x; } int main() { int i,j,m,n; char a[201],b[201]; int c[201][201]; while(cin>>a>>b) {int Max=0; for(i=0;i<=max(strlen(a),strlen(b));i++) { c[i][0]=0;c[0][i]=0; } for(i=1;i<=strlen(a);i++) for(j=1;j<=strlen(b);j++) { if(a[i-1]==b[j-1]) c[i][j]=c[i-1][j-1]+1; else c[i][j]=max(c[i][j-1],c[i-1][j]); if(Max<c[i][j]) Max=c[i][j]; } cout<<Max<<endl; } return 0; }
相关文章推荐
- 动态规划练习-4(公共子序列)
- 动态规划练习一 04:公共子序列
- 动态规划解决最长公共序列
- HHU暑期第四弹——动态规划入门(01背包+完全背包+多重背包+最长上升子序列和公共子序列)
- 最长公共字序列 动态规划 空间复杂度o(min{n,m})带打印
- 数据结构之(动态规划)之最长公共序列
- 最长递增、递减子序列(导弹拦截问题)动态规划练习
- 动态规划——最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串最小编辑距离日记整理
- [算法导论]动态规划---最长公共最序列问题
- [ACM_动态规划] UVA 12511 Virus [最长公共递增子序列 LCIS 动态规划]
- 动态规划 最常公共子序列问题
- poj-2806-公共子序列-C语言-动态规划
- 动态规划 - 最长公共子序列 - 最长公共子串 - 最长不重复子串 - 最长递增子序列 - 最长回文子串
- 利用动态规划找出最长公共单调递增子序列
- 最大公共子序列,最大子段和(动态规划)
- 最大公共子序列--动态规划
- hud1151 动态规划 最大的公共子序列
- 最长连续公共子序列---动态规划
- 动态规划求一道 类最长递增公共子序列
- 动态规划-公共子序列