#include <stdio.h>
void lcs_length(const int m,const int n ,int (*count)[n+1],char (*res)[n],const char * x,const char * y);
int print_lcs(int a,int b,int n,char (*res)[n],char *y);
int main(void)
{ int m;
int n;
m=7;
n=6;
int count[m+1][n+1];
char res[m][n];
char x[7]={'A','B','C','B','D','A','B'};
char y[6]={'B','D','C','A','B','A'};
lcs_length(m,n,count,res,x,y);
for(int i=0;i<m+1;i++)
{ for(int j=0;j<n+1;j++)
printf("%d",count[i][j]);
putchar('\n');
}
for(int i=0;i<m;i++)
{ for(int j=0;j<n;j++)
printf("%c",res[i][j]);
putchar('\n');
}
printf("good\n");
print_lcs(6,5,6,res,y);
putchar('\n');
}
void lcs_length(const int m,const int n ,int (*count)[n+1],char (*res)[n],const char * x,const char * y)
{
int i,j;
for(i=0;i<n+1;i++)
count[0][i]=0;
for(i=1;i<m+1;i++)
count[i][0]=0;
for(i=1;i<=m;i++)
{ for(j=1;j<=n;j++)
{ if(x[i-1]==y[j-1])
{ count[i][j]=count[i-1][j-1]+1;
res[i-1][j-1]='!';
}
else if(count[i-1][j]>=count[i][j-1])
{ count[i][j]=count[i-1][j];
res[i-1][j-1]='|';
}
else
{ count[i][j]=count[i][j-1];
res[i-1][j-1]='-';
}
}
}
}
//参数设置是一件痛苦的事情
//递归的时候,一定要一句一句的分析函数的执行过程,
//不然是发现不了错误所在
int print_lcs(int a ,int b,int n,char (*res)[n],char *y)
{ if(a<0|| b<0)
{ putchar('\n');
return 1;
}
if(res[a][b]=='!')
{ print_lcs(a-1,b-1,n,res,y);
printf("%c",y[b]);
}
else if(res[a][b]=='|')
print_lcs(a-1,b,n,res,y);
else
print_lcs(a,b-1,n,res,y);
}