Alex_tz307

1183. Brackets Sequence - Timus

Nov 1st, 2020
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.78 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3.  
  4. using namespace std;
  5.  
  6. const int NMAX = 128;
  7. int dp[NMAX][NMAX];
  8. string s, ans[NMAX][NMAX];
  9. // dp[i][j] - numarul minim de paranteze ce trebuie adaugate secventei i...j pentru a fi corecta
  10. // ans[i][j] - noua secventa i...j(corecta)
  11.  
  12. char reversed(char ch) {
  13.     if(ch == '(')
  14.         return ')';
  15.     if(ch == ')')
  16.         return '(';
  17.     if(ch == '[')
  18.         return ']';
  19.     return '[';
  20. }
  21.  
  22. void Solve(int i, int j) {
  23.     if(i == j) {
  24.         dp[i][j] = 1;
  25.         string aux{s[i], reversed(s[i])};
  26.         if(aux[0] == ')' || aux[0] == ']')
  27.             swap(aux[0], aux[1]);
  28.         ans[i][i] = aux;
  29.     }
  30.     else
  31.         if(i == j - 1 && s[i] == reversed(s[j]) && (s[i] == '(' || s[i] == '[')) {
  32.             string aux{s[i], s[j]};
  33.             ans[i][j] = aux;
  34.             dp[i][j] = 0;
  35.         }
  36.     else {
  37.         if(s[i] == reversed(s[j]) && (s[i] == '(' || s[i] == '[')) {
  38.             if(dp[i + 1][j - 1] == INF)
  39.                 Solve(i + 1, j - 1);
  40.             if(dp[i][j] > dp[i + 1][j - 1]) {
  41.                 dp[i][j] = dp[i + 1][j - 1];
  42.                 ans[i][j] = s[i] + ans[i + 1][j - 1] + s[j];
  43.             }
  44.         }
  45.         for(int k = i; k < j; ++k) {
  46.             if(dp[i][k] == INF)
  47.                 Solve(i, k);
  48.             if(dp[k + 1][j] == INF)
  49.                 Solve(k + 1, j);
  50.             if(dp[i][j] > dp[i][k] + dp[k + 1][j]) {
  51.                 dp[i][j] = dp[i][k] + dp[k + 1][j];
  52.                 ans[i][j] = ans[i][k] + ans[k + 1][j];
  53.             }
  54.         }
  55.     }
  56. }
  57.  
  58. int main() {
  59.     cin >> s;
  60.     s = '0' + s;
  61.     int N = s.size() - 1;
  62.     for(int i = 0; i < NMAX; ++i)
  63.         for(int j = 0; j < NMAX; ++j)
  64.             dp[i][j] = INF;
  65.     Solve(1, N);
  66.     cout << ans[1][N];
  67. }
  68.  
Advertisement
Add Comment
Please, Sign In to add comment