首页 > 代码库 > 最长公共子序列(LCS)
最长公共子序列(LCS)
简单的DP。
f[i][j]表示序列a中前i个中,序列b中前b个中,组成的最长公共子序列的长度。
DP方程:
if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1;
else f[i][j]=max(f[i-1][j],f[i][j-1]);
(我这个a下标是从0开始,f是从1开始的)
很容易理解,就是当前这一对相同就加,不同就保持之前的。
例题:http://acm.hdu.edu.cn/showproblem.php?pid=1159
代码:
1 #include<cstdio> 2 #include<cmath> 3 #include<iostream> 4 #include<cstring> 5 #include<algorithm> 6 #include<cmath> 7 #include<map> 8 #include<set> 9 using namespace std;10 #define ll __int6411 #define usint unsigned int12 #define mz(array) memset(array, 0, sizeof(array))13 #define minf(array) memset(array, inf, sizeof(array))14 #define REP(i,n) for(int i=0;i<(n);i++)15 #define FOR(i,x,n) for(int i=(x);i<=(n);i++)16 #define RE freopen("1.in","r",stdin)17 #define WE freopen("1.out","w",stdout)18 19 const int maxn=1111;20 char a[1111],b[1111];21 int f[1111][1111];22 int main() {23 int la,lb,i,j,k;24 while(scanf("%s %s",a,b)!=EOF) {25 la=strlen(a);26 lb=strlen(b);27 mz(f);28 for(i=1; i<=la; i++)29 for(j=1; j<=lb; j++)30 if(a[i-1]==b[j-1]) f[i][j]=f[i-1][j-1]+1;31 else f[i][j]=max(f[i-1][j],f[i][j-1]);32 printf("%d\n",f[la][lb]);33 }34 return 0;35 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。