LCS的做备忘录算法

来源:互联网 发布:java中replace函数 编辑:程序博客网 时间:2024/05/29 23:47
/*输入:两个字符串输出:最长公共子序列算法思想:自顶向下的做备忘录,递归*/#include <iostream>#include <cstring>using namespace std;string x,y;int c[100][100];int b[100][100];int inf = 0x7fff;   //int最大2^15-1//int xx,yy;     //特别注意!!递归函数内部用到的变量不能声明为全局变量,而应该每次递归定义一次!!int lookup_LCS(string x,string y,int i,int j){    if(c[i][j]<inf)     //若已经填表,直接返回表项值,不必重新计算        return c[i][j];    if(x[i-1]==y[j-1])    {        c[i][j]=lookup_LCS(x,y,i-1,j-1)+1;  //递归计算        b[i][j]=0;    }    else    {        int xx=lookup_LCS(x,y,i-1,j);        int yy=lookup_LCS(x,y,i,j-1);        //c[i][j]=max(xx,yy);        if(xx>=yy)        {            c[i][j]=xx;            b[i][j]=1;        }        else        {            c[i][j]=yy;            b[i][j]=-1;        }    }    return c[i][j];}int memoized_LCS(string x,string y){    int m,n,i,j,res;    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++)   //初始化c[][],b[][]        for(j=1;j<=n;j++)        {            c[i][j]=inf;            b[i][j]=inf;        }    res = lookup_LCS(x,y,m,n);    cout <<res <<endl;    return 0;}void print_lcs(string x,int b[][100],int i,int j)  //根据b[][]构造一个最优解,打印{    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 m,n,i,j;    cin >>x;    cin >>y;    m=x.length();    n=y.length();    memoized_LCS(x,y);    print_lcs(x,b,m,n);    cout <<endl;    for(j=1;j<=n;j++)       //打印c[][]和b[][]        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;}


                                             
0 0