hdu 1503 LCS

来源:互联网 发布:淘宝联盟微信推广 编辑:程序博客网 时间:2024/06/06 20:57
//71025762012-11-06 23:49:51Accepted15030MS408K1796 BG++chen//1A 只需记录一下共同的位置,然后分段输出就行了 #include<iostream>using namespace std;char x[105];char y[105];int c[105][105];int posx[105];int posy[105];int m,n,i,j,len,num;void lcs(){    for(i=1;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]==y[j])                c[i][j]=c[i-1][j-1]+1;            else if(c[i-1][j]>=c[i][j-1])                c[i][j]=c[i-1][j];            else                c[i][j]=c[i][j-1];                          }    len=c[m][n];}void get_pos(int a,int b){    if(a==0||b==0)        return;    if(x[a]==y[b]){        get_pos(a-1,b-1);        int tmp_num=++num;        posx[tmp_num]=a;        posy[tmp_num]=b;    }else if(c[a-1][b]>=c[a][b-1]){        get_pos(a-1,b);    }    else        get_pos(a,b-1);}int main(){    while(scanf("%s%s",x+1,y+1)!=EOF){        m=strlen(x+1);        n=strlen(y+1);        lcs();        num=0;        get_pos(m,n);        int startx=1,starty=1;        for(i=1;i<=len;i++){            if(posx[i]!=startx){                for(j=startx;j<posx[i];j++){                     cout<<x[j];                }                startx=posx[i]+1;            }else{                startx++;            }            if(posy[i]!=starty){                for(j=starty;j<posy[i];j++){                    cout<<y[j];                }                starty=posy[i]+1;            }else{                starty++;            }            cout<<y[posy[i]];        }        if(startx<=m)            for(i=startx;i<=m;i++)                cout<<x[i];        if(starty<=n)            for(i=starty;i<=n;i++)                cout<<y[i];        cout<<endl;    }        return 0;}

原创粉丝点击