51Nod 1006 - 最长公共子序列(Lcs)

来源:互联网 发布:js判断对象包含某个key 编辑:程序博客网 时间:2024/06/05 06:18

1006 最长公共子序列Lcs
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba
abdkscab
Output示例
abca

解题思路:
在输出的时候要从最后向前遍历,如果符合条件那么压栈.

AC代码:

#include<stdio.h>#include<string>#include<algorithm>#include<iostream>using namespace std;const int maxn = 1005;int dp[maxn][maxn];int main(){    string a;    string b;    cin >> a >> b;    int len_a = a.size();    int len_b = b.size();    for(int i = 1;i <= len_a;i++)    {        for(int j = 1;j <= len_b;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]);        }    }    int len = dp[len_a][len_b];    string ans;    while(dp[len_a][len_b])    {        if(dp[len_a][len_b] == dp[len_a-1][len_b])  len_a--;        else if(dp[len_a][len_b] == dp[len_a][len_b-1]) len_b--;        else    ans.push_back(a[len_a-1]),len_a--,len_b--;    }    for(int i = len-1;i >= 0;i--)   printf("%c",ans[i]);    return 0;}
0 0
原创粉丝点击