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(最长公共子序列) 题解的主要内容,如果未能解决你的问题,请参考以下文章

POJ1458 Common Subsequence

POJ #1458 Common Subsequence

poj 1458 Common Subsequence(dp)

POJ 1458 - Common Subsequence(最长公共子串)

POJ1458 Common Subsequence —— DP 最长公共子序列(LCS)

HDU1159 && POJ1458:Common Subsequence(LCS)