• 打印路径——最长公共子序列打印路径


    打印路径时需要引进一个数组b进行递归打印

    在LCS中,如果是公共子节点,则标记为1,如果不是,标记为2、3,分别表示往上递归或者往左递归

    对于样例:

    /*输入
    ABCBDAB
    BDCABA
    */
    数组c中各值为:

    数组b中各值为:

                                             

    # include<stdio.h>
    # include<string.h>
    # define maxn 105
    # define max(a,b) a>b?a:b
    int c[maxn][maxn],b[maxn][maxn],m,n;
    char x[maxn],y[maxn];
    void lcs(int i,int j)
    {
        if (i ==0 || j==0) return;
        if (b[i][j]== 1)
        {
            lcs(i-1,j-1);
            printf("%c",x[i-1]);
        }
        else if (b[i][j]== 2)
            lcs(i-1,j);
        else
            lcs(i,j-1);
    }
    
    int main()
    {
        int i,j;
        while(gets(x)&&gets(y))
        {
            m=strlen(x);
            n=strlen(y);
            for(i=0; i<=m; i++)
                c[i][0] = 0;
            for(j=0; 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]=1;
                    }
                    else if (c[i-1][j]>=c[i][j-1])
                    {
                        c[i][j]=c[i-1][j];
                        b[i][j]=2;
                    }
                    else
                    {
                        c[i][j]=c[i][j-1];
                        b[i][j]=3;
                    }
                }
            }
            printf("最长公共子序列长度 = %d
    ",c[m][n]);
            printf("最长公共子序列是: ");
            lcs(m,n);
            puts("");
        }
        return 0;
    }
    /*输入
    ABCBDAB
    BDCABA
    */
  • 相关阅读:
    【并查集】亲戚
    【图论】Car的旅行线路 NOIP 2001
    【贪心】排座椅
    【DP】花店橱窗布置
    【NOIP】NOIP考纲总结+NOIP考前经验谈
    【NOIP】考前须知
    NOIP 2016 PJ T4 魔法阵
    NOIP 2016 PJ T3 海港
    【高精度】麦森数 NOIP 2003
    【带权并查集】食物链 NOIP 2001
  • 原文地址:https://www.cnblogs.com/acm-bingzi/p/3182797.html
Copyright © 2020-2023  润新知