1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #include<iostream> #include<vector> using namespace std;
int LSCLen(char* arr, char* brr, int m, int n, vector<vector<int>>& dp, vector<vector<int>>& sp) { if (m == 0 || n == 0) return 0; else if(dp[m][n] != 0) { return dp[m][n]; } else { if (arr[m] == brr[n]) { dp[m][n] = LSCLen(arr, brr, m - 1, n - 1, dp, sp) + 1; sp[m][n] = 1; } else { int max1 = LSCLen(arr, brr, m - 1, n, dp, sp); int max2 = LSCLen(arr, brr, m, n - 1, dp, sp); if (max1 > max2) { dp[m][n] = max1; sp[m][n] = 2; } else { dp[m][n] = max2; sp[m][n] = 3; } } } return dp[m][n]; }
void PrintVector(vector<vector<int>>& vc) { for (const auto& x : vc) { for (const auto& y : x) { cout << y << " "; } cout << endl; } cout << endl; } void LCS(vector<vector<int>>& sp, char* arr, int i, int j) { if (i == 0 || j == 0) return; if (sp[i][j] == 1) { LCS(sp, arr, i - 1, j - 1); cout << arr[i]; } else if (sp[i][j] == 2) { LCS(sp, arr, i - 1, j); } else { LCS(sp, arr, i, j - 1); } }
int main() { char x[] = "#ABCBDAB"; char y[] = "#BDCABA"; int m = strlen(x); int n = strlen(y);
vector<vector<int>> dp, sp; dp.resize(m); sp.resize(m); for (int i = 0; i < m; ++i) { dp[i].resize(n, 0); sp[i].resize(n, 0); } cout << LSCLen(x, y, m - 1, n - 1, dp, sp) << endl; PrintVector(dp); PrintVector(sp); LCS(sp, x, m - 1, n - 1); return 0; }
|