#include <iostream>
#include <string>
using namespace std;
#define X_LEN 7
#define Y_LEN 6
#define EQUAL 0
#define UP 1
#define LEVEL 2
//计算出最终子序列
void lcs_length(char* X,char* Y,int c[X_LEN+1][Y_LEN+1],int b[X_LEN+1][Y_LEN+1]);
void print_lcs(int b[X_LEN+1][Y_LEN+1],char *X,int i,int j);
int main()
{
char X[X_LEN+1] = {' ','A','B','C','B','D','A','B'};
char Y[Y_LEN+1] = {' ','B','D','C','A','B','A'};
int c[X_LEN+1][Y_LEN+1]={0};
int b[X_LEN+1][Y_LEN+1] = {0};
int i,j;
lcs_length(X,Y,c,b);
for(i=0;i<=X_LEN;i++)
{
for(j=0;j<=Y_LEN;j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
cout<<"The length of LCS is: "<<c[X_LEN][Y_LEN]<<endl;
cout<<"The longest common subsequence between X and y is: "<<endl;
print_lcs(b,X,X_LEN,Y_LEN);
return 0;
}
//采用动态规划方法自底向上的进行计算,寻找最优解
void lcs_length(char* X,char* Y,int c[X_LEN+1][Y_LEN+1],int b[X_LEN+1][Y_LEN+1])
{
int i,j;
//设置边界条件,即i=0或者j=0
for(i=0;i<X_LEN;i++)
c[i][0] = 0;
for(j=0;j<Y_LEN;j++)
c[0][j] = 0;
for(i=1;i<=X_LEN;i++)
for(j=1;j<=Y_LEN;j++)
{
if(X[i] == Y[j]) //满足递归公式第二条
{
c[i][j] = c[i-1][j-1]+1;
b[i][j] = EQUAL ;
}
else if(c[i-1][j] >= c[i][j-1]) //递归公式第三条
{
c[i][j] = c[i-1][j];
b[i][j] = UP;
}
else
{
c[i][j] = c[i][j-1];
b[i][j] = LEVEL;
}
}
}
void print_lcs(int b[X_LEN+1][Y_LEN+1],char *X,int i,int j)
{
if(i==0 || j==0)
return;
if(b[i][j] == EQUAL)//匹配上就进行打印
{
print_lcs(b,X,i-1,j-1);
cout<<X[i]<<" ";
}
else
if(b[i][j] == UP)
print_lcs(b,X,i-1,j);
else
print_lcs(b,X,i,j-1);
}