zoukankan      html  css  js  c++  java
  • LCS最长公共子序列


    http://poj.org/problem?id=1458

    image

    #include<iostream>

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int MAXN=1000;
    char sz1[MAXN];
    char sz2[MAXN];
    int dp[MAXN+10][MAXN+10];
    /*
    最后一个字符相同
    dp[i][j]=dp[i-1][j-1]+1;
    最后一个字符不同:
    dp[i][j]=max(dp[i-1][j], dp[i][j-1]);

    dp[i][0]=0;
    dp[0][j]=0;
    */
    int main()
    {
        while(scanf("%s%s", sz1+1, sz2+1)==2)
        {
            int len1=strlen(sz1+1);
            int len2=strlen(sz2+1);
            for(int i=1;i<=len1;i++)
                for(int j=1;j<=len2;j++)
                {
                    if(sz1[i]==sz2[j])
                        dp[i][j]=dp[i-1][j-1]+1;
                    else
                        dp[i][j]=max(dp[i-1][j], dp[i][j-1]);
                }
            printf("%d
    ",dp[len1][len2]);
        }
        return 0;
    }


    改进一下,增加公共字符串打印:就是增加一个c数组用来记录选择的方向

    #include<iostream>

    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int MAXN=1000;
    char sz1[MAXN];
    char sz2[MAXN];
    int dp[MAXN+10][MAXN+10];
    char c[MAXN+10][MAXN+10];
    /*
     *
    dp[i][0]=0;
    dp[0][j]=0;

    最后一个字符相同
    dp[i][j]=dp[i-1][j-1]+1;
    最后一个字符不同:
    dp[i][j]=max(dp[i-1][j], dp[i][j-1]);


    */

    void print_lcs(int i, int j)
    {
        if(i==0 || j==0) return;
        if(c[i][j]=='d')
        {
            print_lcs(i-1, j-1);
            printf("%c", sz1[i]);
        }
        else if(c[i][j]=='u')
            print_lcs(i-1, j);
        else
            print_lcs(i, j-1);
    }

    int main()
    {
        while(scanf("%s%s", sz1+1, sz2+1)==2)//第0个字符空着,从1开始存
        {
            int len1=strlen(sz1+1);
            int len2=strlen(sz2+1);
            for(int i=0;i<=len1;i++)
                dp[i][0]=0;
            for(int j=0;j<=len2;j++)
                dp[0][j]=0;
            for(int i=1;i<=len1;i++)
                for(int j=1;j<=len2;j++)
                {
                    if(sz1[i]==sz2[j])
                    {
                        dp[i][j]=dp[i-1][j-1]+1;
                        c[i][j]='d';//斜对角
                    }
                    else
                    {
                        if(dp[i-1][j]>dp[i][j-1])
                        {
                           dp[i][j]=dp[i-1][j];
                           c[i][j]='u';//上
                        }
                        else
                        {
                            dp[i][j]=dp[i][j-1];
                            c[i][j]='l';//左
                        }

                    }
                }
            printf("%d
    ",dp[len1][len2]);
            print_lcs(len1, len2);
            printf("
    ");
        }
        return 0;
    }

    参考
    程序设计导引及在线实践
    计算机算法设计与分析(第2版)_王晓东
    计算机算法设计与分析+王晓东+(第3版)

  • 相关阅读:
    css选择器
    有关cookies与session的详细信息
    06OC之内存管理
    04OC之分类Category,协议Protocol,Copy,代码块block
    IOS学习目录
    03OC的类的补充
    02OC的类和对象
    02第一个OC程序
    01OC概述
    02快速学习ExtJs之---第一个HelloWord!
  • 原文地址:https://www.cnblogs.com/cute/p/15272864.html
Copyright © 2011-2022 走看看