Advertisement
Josif_tepe

Untitled

Mar 3rd, 2022
1,204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.75 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std;
  6. string a, b;
  7. int dp[3005][3005];
  8. pair<int, int> backtrack[3005][3005];
  9. char bukva[3005][3005];
  10. int rek(int i, int j) {
  11.     if(i < 0 or j < 0) {
  12.         return 0;
  13.     }
  14.     if(dp[i][j] != -1) {
  15.         return dp[i][j];
  16.     }
  17.     int result = 0;
  18.     int r1 = -10, r2 = 0, r3 = 0;
  19.     if(a[i] == b[j]) {
  20.         r1 =  rek(i - 1, j - 1) + 1;
  21.     }
  22.     r2 =  rek(i - 1, j);
  23.     r3 =  rek(i, j - 1);
  24.     result = max(r1, max(r2, r3));
  25.     if(r3 == result) {
  26.         backtrack[i][j] = make_pair(i, j - 1);
  27.         bukva[i][j] = '.';
  28.     }
  29.     else if(r2 == result) {
  30.         backtrack[i][j] = make_pair(i - 1, j);
  31.         bukva[i][j] = '.';
  32.     }
  33.     else {
  34.        
  35.             backtrack[i][j] = make_pair(i - 1, j - 1);
  36.             bukva[i][j] = a[i];
  37.     }
  38.     dp[i][j] = result;
  39.     return result;
  40. }
  41. int main()
  42. {
  43.     ios_base::sync_with_stdio(false);
  44.     cout.tie(0);
  45.     cin.tie(0);
  46.     cin >> a >> b;
  47.     for(int i = 0; i < a.size(); i++) {
  48.         for(int j = 0; j < b.size(); j++) {
  49.             dp[i][j] = -1;
  50.         }
  51.     }
  52.     if(rek((int) a.size() - 1, (int) b.size() - 1) == 0) {
  53.         cout << "" << endl;
  54.         return 0;
  55.     }
  56.     pair<int, int> p = make_pair(a.size() - 1, b.size() - 1);
  57.     string s = "";
  58.     while(true) {
  59.         if(p.first >= 0 and p.second >= 0) {
  60.             s += bukva[p.first][p.second];
  61.             p = make_pair(backtrack[p.first][p.second].first, backtrack[p.first][p.second].second);
  62.         }
  63.         else {
  64.             break;
  65.         }
  66.     }
  67.     for(int i = (int) s.size() - 1; i >= 0; i--) {
  68.         if(s[i] != '.') {
  69.             cout << s[i];
  70.         }
  71.     }
  72.     return 0;
  73.  
  74. }
  75.  
  76.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement