1006 最长公共子序列Lcs

给出两个字符串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,模版都背会了,可是DP还是不会,不懂,不知道,DP大概是魔鬼吧。。。。。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#define maxn 1005
using namespace std;
int dp[maxn][maxn];
int main(){
    string s1,s2;
    while(cin>>s1>>s2){
        string s3;
        memset(dp,0,sizeof(dp));
        int maxx=-1;
        dp[0][0]=0;
        for(int i=1;i<=s1.size();i++){
            for(int j=1;j<=s2.size();j++){
                if(s1[i-1]==s2[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 a=s1.size(),b=s2.size(),c=dp[a][b];
        for(int i=a-1;i>=0;i--){
            for(int j=b-1;j>=0;j--){
                if(s1[i]==s2[j]&&dp[i+1][j+1]==c){
                    s3+=s1[i];a=i;b=j;//cout<<a<<b<<endl;
                    c--;break;
                }
            }if(c==0)break;
        }
        reverse(s3.begin(),s3.end());
        cout<<s3<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/lpeaceminusone/article/details/81020450
今日推荐