1. 程式人生 > >POJ 1458 - Common Subsequence(最長公共子序列) 題解

POJ 1458 - Common Subsequence(最長公共子序列) 題解

void 方式 mem strong 輸出 inline ron eof init

此文為博主原創題解,轉載時請通知博主,並把原文鏈接放在正文醒目位置。

題目鏈接: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(最長公共子序列) 題解