该题是一道最长公共子序列的DP题。问题在于如何保存序列。我采用了每个阶段都保存的土方法。
具体如下:
#include<stdio.h>
#include<string.h>
#define maxn 105
#define maxm 32
char a[maxn][maxm],b[maxn][maxm];
int d[maxn][maxn];
char s[maxn][maxn][maxn];
int main()
{
while(~scanf("%s",a[1]))
{
int len1=1,len2=1;
while(a[len1][0]!='#')
scanf("%s",a[++len1]);
len1--;
do
{
scanf("%s",b[len2]);
}while(b[len2++][0]!='#');
len2-=2;
d[0][0]=0;s[0][0][0]='\0';
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
{
//d[i][j]=max(d[i-1][j],d[i][j-1]);
if(d[i-1][j]>d[i][j-1])
{
d[i][j]=d[i-1][j];
strcpy(s[i][j],s[i-1][j]);
}
else
{
d[i][j]=d[i][j-1];
strcpy(s[i][j],s[i][j-1]);
}
if(strcmp(a[i],b[j])==0&&d[i-1][j-1]+1>d[i][j])
{
d[i][j]=d[i-1][j-1]+1;
strcpy(s[i][j],s[i-1][j-1]);
int temp=strlen(s[i-1][j-1]);
s[i][j][temp]=i;
s[i][j][temp+1]='\0';
}
}
int temp=strlen(s[len1][len2]);
for(int i=0;i<temp-1;i++)
{
printf("%s ",a[s[len1][len2][i]]);
}
printf("%s\n",a[s[len1][len2][temp-1]]);
}
return 0;
}