LCS 最长公共子序列
与Edit Distance问题类似, 纯dp
状态转移方程如下
在poj上找了一道题目 poj1458, 水过
代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
时间复杂度O(M*N)
空间复杂度O(M*N), 如果不需要回溯出具体子序列的结果, 可以压缩至线性