动态规划法求解,标准的C语言,可以求出其中一个解
#include <stdio.h>
void lcs(int m, int n,char *x,char *y,int **c,int **b)
{
int i,j;
for(i=1;i<m+1;i++)
c[i][0]=0;
for(i=1;i<n+1;i++)
c[0][i]=0;
for(i=1;i<m+1;i++)
{
for(j=1;j<n+1;j++)
{
if(x[i]==y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=1;
}
else
{
if(c[i-1][j]>c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=2;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=3;
}
}
}
}
}
void out(int i, int j, char *x, int **b)
{
if(i==0|| j==0)
return;
if(b[i][j]==1)
{
out(i-1,j-1,x,b);
printf("%c",x[i]);
}
else
if(b[i][j]==2)
out(i-1,j,x,b);
else
out(i,j-1,x,b);
}
int main()
{
char x[100], y[100];
int m,n;
int **c, int **b;
int i;
printf("please input the length of the two strings:");
scanf("%d %d",&m,&n);
getchar();
printf("input the first string:");
for(i=1;i<m+1;i++)
scanf("%c",&x[i]);
getchar();
printf("input the second string:");
for(i=1;i<n+1;i++)
scanf("%c",&y[i]);
c=new int *[m+1];
b=new int *[m+1];
for(i=0;i<m+1;i++)
{
c[i]=new int [n+1];
b[i]=new int [n+1];
}
lcs(m,n,x,y,c,b);
printf("the length of the sub string is %d\n",c[m][n]);
printf("the substring is:");
out(m,n,x,b);
putchar('\n');
return 0;
}