给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba
abdkscab
Output示例
比如两个串为:
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;
}
}