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 }

 

posted @ 2017-08-16 21:05  Leohh  阅读(142)  评论(0编辑  收藏  举报