算法分析设计实践——最长公共子序列
2021-02-03 22:17
标签:EDA ++i gif fine 算法 时间 math ide dash 对于序列a和序列b,求其最长公共子序列 通过动态规划的方式 dp[i][j] 前i个字符的x和前j个字符的y的最长公共子序列 当a[i] = b[j] 的时候 dp[i][j] = max(dp[i][j] , dp[i - 1][j - 1] + 1) 如果第i位和第j位相等的话,那么最长序列长度 + 1 当 a[i] != b[j] 的时候 dp[i][j] = max(dp[i][j] , dp[i - 1][j] , dp[i][j - 1]) 如果第i位和第j不相等的话 , 那么最长公共子序列的长度则从 dp[i - 1][j] 和 dp[i][j - 1] 转移过来 时间复杂度:O(n * m) https://github.com/BambooCertain/Algorithm.git 算法分析设计实践——最长公共子序列 标签:EDA ++i gif fine 算法 时间 math ide dash 原文地址:https://www.cnblogs.com/DreamACMer/p/12799216.html算法分析设计实践——最长公共子序列
1.问题
2.解析
3.设计
1 void lcs()
2 {
3 for (int i = 0; i 0] = 0;
4 for (int i = 0; i 0][i] = 0;
5 for (int i = 1; i i)
6 {
7 for (int j = 1; j j)
8 {
9 if (arr[i] == brr[j])
10 dp[i][j] = dp[i - 1][j - 1] + 1;
11 else
12 {
13 if (dp[i - 1][j] > dp[i][j - 1])
14 {
15 res[i][j] = 1;
16 dp[i][j] = dp[i - 1][j];
17 }
18 else
19 {
20 res[i][j] = 2;
21 dp[i][j] = dp[i][j - 1];
22 }
23 }
24 }
25 }
26 }
27 string getlcs()
28 {
29 int i = len1, j = len2;
30 string ans = "";
31 while (i > 0 && j > 0)
32 {
33 if (!res[i][j])
34 {
35 ans = arr[i] + ans;
36 i--, j--;
37 }
38 else if (res[i][j] == 1)
39 {
40 i--;
41 }
42 else
43 {
44 j--;
45 }
46 }
47 return ans;
48 }
4.分析
5.源码
1 #include