1006 最长公共子序列Lcs

来源:互联网 发布:淘宝店铺客服链接获取 编辑:程序博客网 时间:2024/06/11 00:09

给出两个字符串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


动态规划,转移方程dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]+ai[i]==bi[j]?1:0)
打印最长路时要根据代码仔细思考一下

#include"iostream"#include"vector"using namespace std;int dp[1007][1007]={0};string jj;int main(){    string ai,bi;    int mmax=-1e9;    cin>>ai>>bi;    for(int i=0;i<ai.size();i++)    {        for(int j=0;j<bi.size();j++)        {            dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);            if(ai[i]==bi[j])                dp[i+1][j+1]=dp[i][j]+1;             if(dp[i+1][j+1]>mmax)                mmax=dp[i+1][j+1];        }    }    int a=ai.size()-1;    int b=bi.size()-1;    while(a>=0&&b>=0)    {        if(ai[a]==bi[b])        {            jj+=ai[a];            a--;            b--;        }        else if(dp[a+1][b]>dp[a][b+1])            b--;        else            a--;    }    for(int i=mmax-1;i>=0;i--)        cout<<jj[i];    cout<<endl;    return 0;}
0 0
原创粉丝点击