最长公共子序列:
简单的递归吧:
直接上代码吧:
函数
c[i][j] = c[i-1][j-1](xi == yi)
c[i][j] = 0 (i=0 || j=0)
c[i][j] = max(c[i-1][j-1](xi != yi)
输出用递归输出
直接代码:
#include <iostream>
#include <cstdio>
#include <cstdio>
#include <cstring>
const int MAXN = 100;
int m,n;
int rmax(int a,int b)
{
if(a>b)
return a;
return b;
}
void LCS(char *x,char *y,int b[][MAXN],int c[][MAXN])
{
int i,j;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(x[i]==y[j])
{
c[i][j] = c[i-1][j-1]+1;
b[i][j] = 0;
}
else
{
c[i][j] = rmax(c[i-1][j],c[i][j-1]);
b[i][j] = (c[i-1][j] > c[i][j-1])?1:-1;
}
}
}
void print(char *x,int b[][MAXN],int i,int j)
{
if(i==0 || j==0)
return;
if(b[i][j] == 0)
{
print(x,b,i-1,j-1);
printf("%c",x[i]);
}
else if(b[i][j] == 1)
print(x,b,i-1,j);
else
print(x,b,i,j-1);
}
int main()
{
char X[MAXN],Y[MAXN];
int b[MAXN][MAXN],c[MAXN][MAXN];
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",X+1);
scanf("%s",Y+1);
m=strlen(X+1);
n = strlen(Y+1);
LCS(X,Y,b,c);
print(X,b,m,n);
return 0;
}