最长公共子序列问题
#include<iostream>
using namespace std;
const int N=100;
char str[N],str1[N];
int c[N][N]={0};
char b[N][N];
void LCS_LENGTH(int a,int b1)
{
int m=a;
int n=b1;
int i,j;
for(i=1;i<=m;i++)
c[i][0]=0;
for(j=0;j<=n;j++)
c[0][j]=0;
for(i=1;i<=m;i++)
for(j=1;j<=n;j++)
{
if(str[i]==str1[j])
{
c[i][j]=c[i-1][j-1]+1;//c[i-1][j-1]在c[i][j]的左上方
b[i][j]='\\';
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];//c[i-1][j]在c[i][j]的上一行
b[i][j]='|';
}
else
{
c[i][j]=c[i][j-1];//c[i][j-1]在c[i][j]的前一列
b[i][j]='-';
}
}
}
void PRINT_LCS(char b[][N],char stri[],int i,int j)
{
if(i==0 || j==0)
return;
if(b[i][j]=='\\')
{
PRINT_LCS(b,stri,i-1,j-1);
cout<<stri[i]<<' ';
}
else if(b[i][j]=='|')
PRINT_LCS(b,stri,i-1,j);
else
PRINT_LCS(b,stri,i,j-1);
}
int main()
{
int m,n;//两个序列的长度
int i,j;
cout<<"Enter m and n: ";
cin>>m>>n;
for(i=1;i<=m;i++)
cin>>str[i];
for(i=1;i<=n;i++)
cin>>str1[i];
LCS_LENGTH(m,n);
PRINT_LCS(b,str,m,n);
return 0;
}