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;
    }
  • 相关阅读:
    C#编程(八)--------- Main函数
    C#编程(七)----------命名空间
    C#编程(五)----流程控制
    C#编程(六)------------枚举
    C#编程(四)
    新一代蓝牙5标准开启 会成为物联网的最佳选择吗
    向阳网络:跬步千里_且看初创企业的上云之路
    单片机如何过渡到嵌入式?
    spark源码系列文章------shuffle模块详解
    Linux系统小技巧(4):环境变量JAVA_TOOL_OPTIONS简介
  • 原文地址:https://www.cnblogs.com/pk28/p/4763243.html
Copyright © 2011-2022 走看看