您的位置:首页 > 其它

动态规划练习——公共子序列

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的长度作为循环边界。

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: