HDU 1159 Common Subsequence:LCS(最长公共子序列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159
题意:
求最长公共子序列。
题解:
(LCS模板题)
表示状态:
dp[i][j] = max len of LCS
a串匹配到第i位,b串匹配到第j位,此时的最长公共子序列长度。
如何转移:
首先,一个明显的决策是,如果a[i] == b[j],那么此一定要匹配。(贪心)
所以分两种情况:
(1)a[i] == b[j]:dp[i][j] = dp[i-1][j-1] + 1
(2)a[i] != b[i]:dp[i][j] = max(dp[i-1][j] , dp[i][j-1])
求dp:两个for循环枚举i,j即可。
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define MAX_N 2005 5 6 using namespace std; 7 8 int lcs[MAX_N][MAX_N]; 9 string a,b; 10 11 int main() 12 { 13 while(cin>>a>>b) 14 { 15 memset(lcs,0,sizeof(lcs)); 16 for(int i=1;i<=a.size();i++) 17 { 18 for(int j=1;j<=b.size();j++) 19 { 20 if(a[i-1]==b[j-1]) lcs[i][j]=lcs[i-1][j-1]+1; 21 else lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]); 22 } 23 } 24 cout<<lcs[a.size()][b.size()]<<endl; 25 } 26 }