模板51nod 1006 最长公共子序列Lcs

Posted driverlao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板51nod 1006 最长公共子序列Lcs相关的知识,希望对你有一定的参考价值。

技术分享图片

【题解】

  dp转移的时候记录一下,然后倒着推出答案即可。

技术分享图片
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define LL long long
 5 #define rg register
 6 #define N 2000
 7 using namespace std;
 8 int n,m,tot,f[N][N],from[N][N][2];
 9 char s1[N],s2[N],ans[N];
10 int main(){
11     scanf("%s",s1+1);
12     scanf("%s",s2+1);
13     n=strlen(s1+1); m=strlen(s2+1);
14     for(rg int i=1;i<=n;i++)
15         for(rg int j=1;j<=m;j++)
16             if(s1[i]==s2[j]) f[i][j]=f[i-1][j-1]+1,from[i][j][0]=i-1,from[i][j][1]=j-1;
17             else{
18                 if(f[i-1][j]>f[i][j-1]) f[i][j]=f[i-1][j],from[i][j][0]=i-1,from[i][j][1]=j;
19                 else f[i][j]=f[i][j-1],from[i][j][0]=i,from[i][j][1]=j-1;
20             }
21     while(n&&m){
22         if(s1[n]==s2[m]) ans[++tot]=s1[n];
23         int t1=from[n][m][0],t2=from[n][m][1];
24         n=t1,m=t2;
25     }
26     for(rg int i=tot;i;i--) printf("%c",ans[i]);
27     return 0;
28 }
View Code

 

以上是关于模板51nod 1006 最长公共子序列Lcs的主要内容,如果未能解决你的问题,请参考以下文章

51Nod 1006 最长公共子序列Lcs

51Nod-1006 最长公共子序列Lcs

最长公共子序列Lcs (51Nod - 1006)

51Nod-1006LCS+输出路径模板题

51nod 1006 最长公共子序列Lcs(dp+string,无标记数组实现)

最长公共子序列lcs