LCS 最长公共子序列

与Edit Distance问题类似, 纯dp

状态转移方程如下

 

在poj上找了一道题目 poj1458, 水过

代码如下

 1 #include <iostream>
 2 #include <string>
 3 #include <cstring>
 4 #include <cmath> 
 5 #include <cstdlib> 
 6 #include <map> 
 7 #include <algorithm> 
 8 #include <vector> 
 9 #include <stack>
10 #include <queue>
11 #include <set>
12 #include <iomanip>
13 #include <stdio.h>
14 
15 using namespace std;
16 #define MAX 1000
17 int **dp;
18 
19 void init()
20 {
21     dp = new int*[MAX];
22     for(int i = 0; i < MAX; i ++)
23     {
24         dp[i] = new int[MAX];
25     }
26 }
27 
28 void reset()
29 {
30     for(int i = 0; i < MAX; i ++)
31     {
32         memset(dp[i], 0, MAX * sizeof(int));
33     }
34 }
35 
36 int LCS(string s1, string s2)
37 {
38     reset();
39 
40     for(int i = 1; i <= s1.length(); i ++)
41     {
42         for(int j = 1; j <= s2.length(); j ++)
43         {
44             if(s1[i - 1] == s2[j - 1])
45                 dp[i][j] = dp[i - 1][j - 1] + 1;
46             else
47                 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
48         }
49     }
50     return dp[s1.length()][s2.length()];
51 }
52 
53 int main(int argc, char *argv[])
54 {
55     init();
56     string s1, s2;
57     while(cin >> s1 >> s2)
58     {
59         cout<<LCS(s1, s2)<<endl;
60     }
61     return 0;
62 }
View Code

时间复杂度O(M*N)

空间复杂度O(M*N), 如果不需要回溯出具体子序列的结果, 可以压缩至线性

posted @ 2014-08-22 12:44  qeDVuHG  阅读(182)  评论(0编辑  收藏  举报