算法 动态规划 最长公共子序列问题

来源:互联网 发布:亿文网络 编辑:程序博客网 时间:2024/06/06 07:26
#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;}
0 0
原创粉丝点击