#include <iostream>
using namespace std;
void LCSlength(int m,int n,char *x,char *y,int **c,int **b)
{
int i,j;
for(i=0; i<=m; i++) c[i][0]=0;
for(i=0; i<=n; i++) c[0][i]=0;
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]=1;
}
else if(c[i-1][j]>=c[i][j-1])
{
c[i][j]=c[i-1][j];
b[i][j]=3;
}
else
{
c[i][j]=c[i][j-1];
b[i][j]=2;
}
}
void LCS(int i,int j,char *x,int **b)
{
if(i==0||j==0)
return;
if(b[i][j]==1)
{
LCS(i-1,j-1,x,b);
cout<<x[i];
}
else if(b[i][j]==2)
LCS(i,j-1,x,b);
else
LCS(i-1,j,x,b);
}
int main()
{
int m1;//=7;
int n1;//=6;
cout<<"请输入第一个序列的个数m的值:";
cout<<endl;
cin>>m1;
cout<<endl;
cout<<"请输入第二个序列的个数n的值:";
cout<<endl;
cin>>n1;
//char X[] = {' ','A','B','C','B','D','A','B'};
//char Y[] = {' ','B','D','C','A','B','A'};
char *X=new char[m1+1];
char *Y=new char[n1+1];
for(int i=1; i<=m1; i++)
{
cout<<"请输入第一个序列的第"<<i<<"个"<<endl;
cin>>X[i];
}
for(int i=1; i<=n1; i++)
{
cout<<"请输入第二个序列的第"<<i<<"个"<<endl;
cin>>Y[i];
}
// X={'A','B','C','B','D','A','B'};
// Y={'B','D','C','A','B','A'};
int **c1=new int*[m1];
int **b1=new int*[m1];
//cout<<"1"<<endl;
for(int i=0; i<=m1; i++)
{
c1[i]=new int[n1+1];
b1[i]=new int[n1+1];
}
// cout<<"2"<<endl;
// X=new char[m1];
//Y=new char[n1];
LCSlength(m1,n1,X,Y,c1,b1);
LCS(m1,n1,X,b1);
//cout << "Hello world!" << endl;
for (int i=0; i<m1; i++)
{
delete[] c1[i];
delete[] b1[i];
}
delete[] c1;
delete[] b1;
//delete[] X;
//delete[] Y;
return 0;
}
算法 动态规划 最长公共子序列问题
最新推荐文章于 2024-09-12 19:02:20 发布