1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

时间:2021-12-04 16:53:33

相关推荐

51NOD 1006 最长公共子序列 Lcs 动态规划 DP 模板题 板子

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:

abcicba

abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

收起

输入

第1行:字符串A第2行:字符串B(A,B的长度 <= 1000)

输出

输出最长的子序列,如果有多个,随意输出1个。

输入样例

abcicbaabdkscab

输出样例

abca

思路就是先求最长公共子序列,然后再根据路径逆推,找到匹配点。

#include<iostream>#include<queue>#include<algorithm>#include<set>#include<cmath>#include<vector>#include<map>#include<stack>#include<bitset>#include<cstdio>#include<cstring>//---------------------------------Sexy operation--------------------------//#define cini(n) scanf("%d",&n)#define cinl(n) scanf("%lld",&n)#define cinc(n) scanf("%c",&n)#define cins(s) scanf("%s",s)#define coui(n) printf("%d",n)#define couc(n) printf("%c",n)#define coul(n) printf("%lld",n)#define speed ios_base::sync_with_stdio(0)#define file freopen("input.txt","r",stdin);freopen("output.txt","w",stdout)//-------------------------------Actual option------------------------------//#define Swap(a,b) a^=b^=a^=b#define Max(a,b) a>b?a:b#define Min(a,b) a<b?a:b#define mem(n,x) memset(n,x,sizeof(n))#define mp(a,b) make_pair(a,b)//--------------------------------constant----------------------------------//#define INF 0x3f3f3f3f#define maxn 1005#define esp 1e-9using namespace std;typedef long long ll;typedef pair<int,int> PII;//------------------------------Dividing Line--------------------------------//string a,b,ans;int dp[maxn][maxn];int main(){ans.clear();cin>>a>>b;a=' '+a;b=' '+b;int la=a.size();int lb=b.size();for(int i=1;i<la;i++){for(int j=1;j<lb;j++){if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}int m=la-1,n=lb-1;while(dp[m][n]){if(dp[m][n]==dp[m-1][n]) m--;else if(dp[m][n-1]==dp[m][n]) n--;else{if(a[m]!=' ')ans=a[m]+ans;m--,n--;}}cout<<ans<<endl;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。