LCS的动态规划算法

来源:互联网 发布:淘宝客链接怎么做 编辑:程序博客网 时间:2024/05/16 07:37
/*输入:两个字符串输出:最长公共子序列算法思想:动态规划*/#include <iostream>#include <cstring>using namespace std;string x,y;  //输入串int c[100][100];   //维护LCS_length的数组int b[100][100];   //用于构造一个最优解int lcs_len(string x,string y){    int m,n,i,j;    m=x.length();    n=y.length();    for(i=0;i<=m;i++)        c[i][0]=0;    for(j=1;j<=n;j++)        c[0][j]=0;    for(i=1;i<=m;i++)        for(j=1;j<=n;j++)        {            if(x[i-1]==y[j-1]) {c[i][j]=c[i-1][j-1]+1;b[i][j]=0;}      //string x 有一个字符的偏移,0表示↖            else if(c[i-1][j]>=c[i][j-1]) {c[i][j]=c[i-1][j];b[i][j]=1;}  //1表示↑            else {c[i][j]=c[i][j-1];b[i][j]=-1;}  //-1表示←        }    return c[m][n];}void print_lcs(string x,int b[][100],int i,int j)  //构造一个最优解{    if(i==0 || j==0) return;    if(b[i][j]==0)    {        print_lcs(x,b,i-1,j-1);        cout <<x[i-1];      //string x 有一个字符的偏移    }    else if(b[i][j]==1)        print_lcs(x,b,i-1,j);    else        print_lcs(x,b,i,j-1);}int main(){    int i,j,m,n;    cin >>x;    cin >>y;    m=x.length();    n=y.length();    cout <<lcs_len(x,y) <<endl;    print_lcs(x,b,m,n);    cout <<endl;    for(j=1;j<=n;j++)        cout  <<" \t" <<y[j-1];    cout <<endl;    for(i=1;i<=m;i++)    {        cout <<x[i-1] <<"\t";        for(j=1;j<=n;j++)            cout <<c[i][j] <<"\t";        cout <<endl;    }    cout <<endl;    for(j=0;j<n;j++)        cout <<" \t" <<y[j];    cout <<endl;    for(i=1;i<=m;i++)    {        cout <<x[i-1] <<"\t";      //string x 有一个字符的偏移        for(j=1;j<=n;j++)            cout <<b[i][j] <<"\t";        cout <<endl;    }    cout <<endl;    return 0;}


                                             
0 0
原创粉丝点击