题意:给出两段单词,找出他们的最长公共子序列并打印
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn1=30+2;
const int maxn2=100+5;
char s1[maxn2][maxn1];
char s2[maxn2][maxn1];
int dp[maxn2][maxn2];
int pre[maxn2][maxn2];
void print(int len1,int len2){
if(len1==0 || len2==0)return ;
if(pre[len1][len2]==0){
print(len1-1,len2-1);
printf("%s ",s1[len1-1]);
}
else if(pre[len1][len2]==1)
print(len1-1,len2);
else print(len1,len2-1);
}
int main(){
while(scanf("%s",s1[0])==1){
int len1=1;
while(strcmp(s1[len1-1],"#"))
scanf("%s",s1[len1++]);
scanf("%s",s2[0]);
int len2=1;
while(strcmp(s2[len2-1],"#"))
scanf("%s",s2[len2++]);
memset(dp,0,sizeof(dp));
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
if(strcmp(s1[i-1],s2[j-1])==0){
dp[i][j]=dp[i-1][j-1]+1;
pre[i][j]=0;
}
else if(dp[i-1][j]>dp[i][j-1]){
dp[i][j]=dp[i-1][j];
pre[i][j]=1;
}
else {
dp[i][j]=dp[i][j-1];
pre[i][j]=-1;
}
print(len1-1,len2-1);
printf("\n");
}
return 0;
}