zoukankan      html  css  js  c++  java
  • LCS模板

    时间复杂度O(m*n)

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <stdio.h>
    #include <algorithm>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #define INF 0x3f3f3f3f
    #define maxn 10000+10
    #define cle(a) memset(a,0,sizeof(a))
    using namespace std;
    char a[maxn],b[maxn];
    int dp[maxn][maxn];
    int main()
    {
        while(cin>>a>>b){
            int la=strlen(a);
            int lb=strlen(b);
            for(int i=0;i<la;i++)dp[i][0]=0;
            for(int j=0;j<lb;j++)dp[0][j]=0;
            //cle(dp)
            for(int i=1;i<=la;i++)
                for(int j=1;j<=lb;j++){
                    if(a[i-1]==b[j-1])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[la][lb]);
        }
        return 0;
    }

    如果要输出最长公共子序列,可以添加flag[][]数组,进行转移方向的记录,逆推。

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <stdio.h>
    #include <algorithm>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #define INF 0x3f3f3f3f
    #define maxn 500+10
    #define cle(a) memset(a,0,sizeof(a))
    using namespace std;
    char a[maxn],b[maxn];
    int dp[maxn][maxn];
    int flag[maxn][maxn];
    char lcs[maxn];
    int main()
    {
        while(cin>>a>>b){
            int la=strlen(a);
            int lb=strlen(b);
            for(int i=0;i<la;i++)dp[i][0]=0;
            for(int j=0;j<lb;j++)dp[0][j]=0;
            //cle(dp)
            for(int i=1;i<=la;i++)
                for(int j=1;j<=lb;j++){
                    if(a[i-1]==b[j-1]){
                        dp[i][j]=dp[i-1][j-1]+1;
                        flag[i][j]=1;//向右下转移
                    }
                    else{
                        if(dp[i-1][j]>dp[i][j-1]){
                            flag[i][j]=2;//向下转移
                            dp[i][j]=dp[i-1][j];
                        }
                        else{
                            flag[i][j]=3;//向右转移
                            dp[i][j]=dp[i][j-1];
                        }
                    }
                }
            int i=la,j=lb;
            int k=0;
            while(i>0&&j>0){
                if(flag[i][j]==1){
                    lcs[k]=a[i-1];
                    k++,i--,j--;
                }
                else if(flag[i][j]==2)i--;
                else if(flag[i][j]==3)j--;
            }
            printf("%d
    ",dp[la][lb]);
            for(int i=k-1;i>=0;i--)
                printf("%c",lcs[i]);
        }
        return 0;
    }
  • 相关阅读:
    使用 jsPlumb 绘制拓扑图 —— 异步加载与绘制的实现
    改善记忆力的二十种记忆方法,随便你挑!
    怎样完成一次比较漂亮的晋升面试演讲
    产品运维的思考与总结
    Jtester+unitils+testng:DAO单元测试文件模板自动生成
    生活、工作和理想
    推荐《需求:缔造伟大商业传奇的根本力量》
    星光之旅
    谈读书
    生命之反思
  • 原文地址:https://www.cnblogs.com/pk28/p/4763243.html
Copyright © 2011-2022 走看看