zoukankan      html  css  js  c++  java
  • 51nod 1006 最长公共子序列Lcs

    给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
    比如两个串为:
     
    abcicba
    abdkscab
     
    ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
     

    输入

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

    输出

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

    输入样例

    abcicba
    abdkscab

    输出样例

    abca

    动态规划状态转移方程为dp[i + 1][j + 1] = max(max(dp[i][j + 1],dp[i + 1][j]),dp[i][j] + (s[i] == t[j] ? 1 : 0));
    构建解字符串采用递归实现。
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define MAX 50000
    #define DMAX 10000
    using namespace std;
    typedef long long ll;
    char s[1001],t[1001];
    int dp[1001][1001],ans,m;
    void getans(int x,int y) {
        if(!x || !y) return ;
        if(s[x - 1] == t[y - 1]) {
            getans(x - 1,y - 1);
            printf("%c",s[x - 1]);
        }
        else if(dp[x][y - 1] > dp[x - 1][y]) getans(x,y - 1);
        else getans(x - 1,y);
    }
    int main() {
        scanf("%s%s",s,t);
        for(int i = 0;s[i];i ++) {
            for(int j = 0;t[j];j ++) {
                dp[i + 1][j + 1] = max(max(dp[i][j + 1],dp[i + 1][j]),dp[i][j] + (s[i] == t[j] ? 1 : 0));
            }
        }
        getans(strlen(s),strlen(t));
    }
  • 相关阅读:
    Android开发--Layout元素
    Android开发--RelativeLayout的应用
    group by调优的一些测试
    mysql explain中key_len的计算
    mysql索引长度的一些限制
    order by调优的一些测试
    metadata lock
    JDBC连接数据库
    Java—Map.Entry
    innodb buffer pool
  • 原文地址:https://www.cnblogs.com/8023spz/p/10055551.html
Copyright © 2011-2022 走看看