POJ 1458 - Common Subsequence(最长公共子序列) 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1458 - Common Subsequence(最长公共子序列) 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接:http://poj.org/problem?id=1458
题目大意:
有若干组数据,每组给出两个字符串(中间用任意数量的空格间隔),输出这两个字符串最长公共子序列的长度。每次输出后换行。
分析:
动态规划求LCS,f[i][j]表示第一个字符串匹配到第i位,第二个字符串匹配到第j位时最长公共子序列的长度。
转移方程:当a[i] = b[i]时,f[i][j] = f[i-1][j-1]+1,其他情况时f[i][j] = max(f[i][j-1],f[i-1][j])
AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 char a[1005],b[1005]; 7 int f[1005][1005]; 8 int lena,lenb; 9 10 inline void init() 11 { 12 lena = strlen(a+1),lenb = strlen(b+1); 13 memset(f,0,sizeof(f)); 14 } 15 16 int main() 17 { 18 while(scanf("%s",a+1) != EOF) 19 {//特殊的读入方式 20 scanf("%s",b+1); 21 init(); 22 for(register int i = 1;i <= lena;++ i) 23 { 24 for(register int j = 1;j <= lenb;++ j) 25 if(a[i] == b[j]) 26 f[i][j] = f[i-1][j-1]+1; 27 else 28 f[i][j] = std::max(f[i][j-1],f[i-1][j]); 29 } 30 printf("%d\n",f[lena][lenb]); 31 } 32 return 0; 33 }
以上是关于POJ 1458 - Common Subsequence(最长公共子序列) 题解的主要内容,如果未能解决你的问题,请参考以下文章
poj 1458 Common Subsequence(dp)
POJ 1458 - Common Subsequence(最长公共子串)