题目链接:51nod1006
最长公共子序列问题可以用动态规划解:
详细分析看这个:
#include<stdio.h>
#include<string.h>
char p[1010],s[1010];
int flag[1010][1010],c[1010][1010],len1,len2;//flag数组用来标记
void LCS(int m,int n)
{
memset(c,0,sizeof(c));
memset(flag,0,sizeof(flag));
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++)
{
if(p[i-1]==s[j-1])
{
c[i][j]=c[i-1][j-1]+1;
flag[i][j]=1;//留下记号
}
else if(c[i-1][j]>=c[i][j-1])//不要省略else
{
c[i][j]=c[i-1][j];
flag[i][j]=2;//留下记号
}
else if(c[i][j-1]>c[i-1][j])//不要省略else
{
c[i][j]=c[i][j-1];
flag[i][j]=3;//留下记号
}
}
}
int printlcs(int m,int n)
{
if(m==0||n==0)
return 0;
if(flag[m][n]==1)//满足flag[m][n]==1,走printlcs(m-1,n-1)这条路
{
printlcs(m-1,n-1);
printf("%c",p[m-1]);
}
else if(flag[m][n]==2)//满足flag[m][n]==2,走printlcs(m-1,n)这条路
printlcs(m-1,n);
else
printlcs(m,n-1);
}
int main()
{
while(scanf("%s%s",p,s)!=EOF)
{
len1=strlen(p);
len2=strlen(s);
LCS(len1,len2);
printlcs(len1,len2);
printf("\n");
}
return 0;
}