题目链接:​​1006​


最长公共子序列的长度都会求了吧???不会?请点这里​​ hdoj 1159 && nyoj 36【DP - LCS】​​  模板呦-.-


这个题又增加了一下难度-让输出最长公共子序列-.-

我们可以再求最长公共子序列的动态转换中记录每一个状态的前缀就行啦-;.-

最后通过那个前缀来找上一个状态-.-没种长度的最前一个准是最长公共子序列的中的一个字符-.-

具体请看代码-.-


代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1020][1020],head[1020][1020][2];
int main()
{
char a[1020],b[1020],c[1020]={0},kp=0;
scanf("%s%s",a,b);
int n=strlen(a);
int m=strlen(b);
memset(dp,0,sizeof(dp));
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
if (a[i-1]==b[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
head[i][j][0]=i-1;
head[i][j][1]=j-1;
// printf("%d %d %c %c %d 6666666\n",i,j,a[i-1],b[j-1],dp[i][j]);
// printf("%d %d %d %d %d 6666666\n",i,j,head[i][j][0],head[i][j][1],dp[i][j]);
}
else
{
if (dp[i-1][j]>dp[i][j-1])
{
dp[i][j]=dp[i-1][j];
head[i][j][0]=i-1;
head[i][j][1]=j;
}
else
{
dp[i][j]=dp[i][j-1];
head[i][j][0]=i;
head[i][j][1]=j-1;
}
// printf("%d %d %d %d %d 6666666\n",i,j,head[i][j][0],head[i][j][1],dp[i][j]);

}
int ii=n,jj=m,ja,jb;
c[dp[ii][jj]]=0;
while (ii&&jj)
{
// printf("%c %c %d %d %d\n",a[ii-1],b[jj-1],ii,jj,dp[ii][jj]);
c[dp[ii][jj]-1]=a[ii-1];
ja=head[ii][jj][0];
jb=head[ii][jj][1];
ii=ja;jj=jb;
}
printf("%s\n",c);
return 0;
}