51Nod- 1006 最长公共子序列Lcs(动态规划)

来源:互联网 发布:mysql编程题及答案 编辑:程序博客网 时间:2024/05/21 19:38

原题链接

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

先使用动态规划,然后根据记录,返回寻找对应字符

#include<iostream>#include<cstring>#include<cstdio>using namespace std;int dp[1005][1005];char a[1005],b[1005],ans[1005];int index=0;int main(){    cin>>a;    getchar();    cin>>b;    int lena=strlen(a);    int lenb=strlen(b);    //计算最长公共子序列的长度    for (int i=1;i<=lena;i++)        for (int  j=1;j<=lenb;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]);    //根据dp内的记录返回,寻找对应的公共字符    int i=lena,j=lenb;    while(dp[i][j])    {        if (dp[i][j]==dp[i-1][j]) i--;        else if (dp[i][j]==dp[i][j-1]) j--;        else ans[index++]=a[i-1],i--,j--;    }    for (int t=index-1;t>=0;t--)        cout<<ans[t];    return 0;}
原创粉丝点击