• 51nod1006 -最长公共子序列Lcs【动态规划】


    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

    比如两个串为:

    abcicba

    abdkscab

    ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

     收起

    输入

    第1行:字符串A
    第2行:字符串B
    (A,B的长度 <= 1000)

    输出

    输出最长的子序列,如果有多个,随意输出1个。

    输入样例

    abcicba
    abdkscab

    输出样例

    abca
    #include <iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<math.h>
    using namespace std;
    const int maxn=1002;
    int dp[maxn][maxn],c[maxn][maxn];
    string a,b;
    void LCS( )
    {
        for(int i=1;i<=a.length();++i)
        {
            for(int j=1;j<=b.length();++j)
            {
                if(a[i-1]==b[j-1])
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                    c[i][j]=1;
                }
                else if(dp[i][j-1]>=dp[i-1][j])
                {
                    dp[i][j]=dp[i][j-1];
                    c[i][j]=2;
                }
                else
                {
                    dp[i][j]=dp[i-1][j];
                    c[i][j]=3;
                }
            }
        }
    }
    void print(int i,int j)
    {
        if(i==0 || j==0)
            return;
        if(c[i][j]==1)
        {
            print(i-1,j-1);
            cout<<a[i-1];
        }
        else if(c[i][j]==2)
            print(i,j-1);
        else
            print(i-1,j);
    }
    int main()
    {
        cin>>a>>b;
        memset(dp,0,sizeof(dp));   //初始化0
        LCS();
        //cout<<dp[a.length()][b.length()]<<endl;
        print(a.length(),b.length());
        return 0;
    }
  • 相关阅读:
    vue中select设置默认选中
    验证码
    JS图片src转义
    int main(int argc, char** argv) 以及CommandLineParser
    Visual Studio2013 配置opencv3.3.0 x64系统
    ubuntu16.04 下安装 visual studio code 以及利用 g++ 运行 c++程序
    第三次作业
    第二次作业
    作业一
    第四次作业
  • 原文地址:https://www.cnblogs.com/aerer/p/9930922.html
Copyright © 2020-2023  润新知