题目要求:
我们称序列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;
}