Advertisement
_Bad_Liar_

Untitled

Dec 7th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.89 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int dp[101][101];
  5. int bk[101][101];
  6. string s;
  7.  
  8. void rec(int l, int r){
  9.     if (dp[l][r] == r - l + 1)
  10.         return;
  11.     if (dp[l][r] == 0){
  12.         cout << s.substr(l, r - l + 1);
  13.             return;
  14.     }
  15.     if (bk[l][r] == -1) {
  16.         cout << s[l];
  17.         rec(l + 1, r - 1);
  18.         cout << s[r];
  19.         return;
  20.     }
  21.     rec(l, bk[l][r]);
  22.     rec(bk[l][r] + 1, r);
  23. }
  24.  
  25.  
  26.  
  27. int main() {
  28.     cin >> s;
  29.     int n = s.size();
  30.     for (int r = 0; r < n; ++r)
  31.         for (int l = r; l >= 0; --l){
  32.             if (l == r)
  33.                 dp[l][r] = 1;
  34.             else{
  35.                 int best = 1000000; int mk = -1;
  36.                 if (s[l] == '(' && s[r] == ')' || s[l] == '[' && s[r] == ']' || s[l] == '{' && s[r] == '}')
  37.                     best = dp[l + 1][r - 1];
  38.                 for (int k = l; k < r; ++k)
  39.                     if (dp[l][k] + dp[k + 1][r] < best){   
  40.                         best = dp[l][k] + dp[k + 1][r];
  41.                         mk = k;
  42.                     }
  43.                 dp[l][r] = best; bk[l][r] = mk;
  44.         }
  45. }
  46.     rec(0, n - 1);
  47.     return 0;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement