码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 1458 - Common Subsequence(最长公共子序列) 题解

时间:2017-08-20 10:07:20      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:匹配   字符串匹配   set   else   poj   长度   void   scan   第一个   

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。

题目链接: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(最长公共子序列) 题解

标签:匹配   字符串匹配   set   else   poj   长度   void   scan   第一个   

原文地址:http://www.cnblogs.com/shingen/p/7398795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!