最长公共子序列。导论上的题目,求得状态方程为:c[i,j]=max(c[i,j-1],[i-1,j])(xi!=yj)or(c[i-1,j-1])(xi=yj)or0
#include<stdio.h>
#include<iostream>
using namespace std;
#define MAX 100
char X[MAX];
char Y[MAX];
int b[MAX][MAX],c[MAX][MAX];
int m,n;
void lcs_length(char *,char *);
void print_lcs(int b[MAX][MAX],char *,int i,int j);
int main()
{
gets(X);
gets(Y);
printf("%s\n%s\n",X,Y);
//lcs_length(X,Y);
//print_lcs(b,Y,m,n);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
printf("%d",c[i][j]);
printf("\n");
}
return 0;
}
void lcs_length(char X[],char Y[])
{
char *x,*y;
x=X;
y=Y;
int i,j;
m=strlen(X);
n=strlen(Y);
for(i=1;i<=m;i++)
c[i][0]=0;
for(j=1;j<=n;j++)
c[0][j]=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
//if(x[i]=='\0'||y[j]=='\0')
// continue;
if(X[i]==Y[j])
{
c[i][j]=c[i-1][j-1]+1;
b[i][j]=0;//xie shang
}
else
{
if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=1;//shang
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=-1;//zuo
}
}
}
}
printf("%d\n",c[m][n]);
}
void print_lcs(int b[MAX][MAX],char x[MAX],int i,int j)
{
if(i==0||j==0)
return;
if(b[i][j]==0)
{
print_lcs(b,x,i-1,j-1);
printf("%c",x[i]);
}
else
{
if(b[i][j]==1)
{
print_lcs(b,x,i-1,j);
}
else
print_lcs(b,x,i,j-1);
}
}