hdu1503Advanced Fruits【最长公共子序列】

来源:互联网 发布:千里眼远程监控软件 编辑:程序博客网 时间:2024/06/06 04:42

这个题是做的第一个LCS,与模板不同的是,这个题要求也按顺序输出每个串与另一个串不同的部分,这个时候就需要研究一下模板各个步骤的意义了==推荐:点击打开链接 的讲解 借一张图来说

看到回溯的路径没?每步找的都是最优解,圆圈中的是公共部分,路径上非圆圈的是其中一个串有,而另一个没有的,在这个题中就是要输出的部分,找好方向,so easy

/**********hdu15032016.2.120MS1664K1378 BG++**********/#include <iostream>#include<cstdio>#include<cstring>using namespace std;int m,n,b[110][110],c[110][110];char x[110],y[110];void cal(){    for(int i=0;i<=m;i++) c[i][0]=0;    for(int i=0;i<=n;i++) c[0][i]=0;    for(int i=1;i<=m;i++)    {        for(int j=1;j<=n;j++)        {            if(x[i-1]==y[j-1])            {                b[i][j]=0;                c[i][j]=c[i-1][j-1]+1;            }            else if(c[i-1][j]>c[i][j-1])            {                b[i][j]=1;                c[i][j]=c[i-1][j];            }            else            {                b[i][j]=-1;                c[i][j]=c[i][j-1];            }        }    }}void print(int i,int j){    if(i==0||j==0)    {        if(j) for(int k=0;k<j;k++) printf("%c",y[k]);        if(i) for(int k=0;k<i;k++) printf("%c",x[k]);        return;    }    if(b[i][j]==0)    {        print(i-1,j-1);        printf("%c",x[i-1]);    }    else    {        if(b[i][j]==1){print(i-1,j);printf("%c",x[i-1]);}        else  {print(i,j-1);printf("%c",y[j-1]);}    }}int main(){  //  freopen("cin.txt","r",stdin);    while(~scanf("%s%s",x,y))    {        m=strlen(x);        n=strlen(y);        cal();        print(m,n);        puts("");    }    return 0;}


0 0
原创粉丝点击