描述:给定两个序列X和Y,求X和Y最长的公共序列,并打印该序列。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1000+5;
char a[maxn],b[maxn];
int ans[maxn][maxn];
void print(int n,int m){
if(!ans[n][m]) return;
if(a[n-1]==b[m-1]){
print(n-1,m-1);
printf("%c",a[n-1]);
}
else if(ans[n][m-1]==ans[n][m]){
print(n,m-1);
}
else if(ans[n-1][m]==ans[n][m]){
print(n-1,m);
}
}
int main(){
while(scanf("%s%s",a,b)==2){
int n=strlen(a);
int m=strlen(b);
//初始化边界
for(int i=0;i<=n;++i)
ans[i][0]=0;
for(int i=0;i<=m;++i)
ans[0][i]=0;
//构造最优解
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
if(a[i-1]==b[j-1]) ans[i][j]=ans[i-1][j-1]+1;
else ans[i][j]=max(ans[i-1][j],ans[i][j-1]);
}
printf("%d\n",ans[n][m]);
print(n,m);
printf("\n");
}
return 0;
}