Advertisement
Arrias

Untitled

Jul 15th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.62 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5.  
  6. int dp[105][105];
  7. int ep[105][105];
  8.  
  9. char f(char c) {
  10. if (c == '(') return ')';
  11. if (c == ')') return '(';
  12. if (c == '{') return '}';
  13. if (c == '}') return '{';
  14. if (c == '[') return ']';
  15. if (c == ']') return '[';
  16. }
  17.  
  18.  
  19. string s;
  20.  
  21. void rec(int l, int r) {
  22. if (dp[l][r] == r - l + 1)
  23. return;
  24. if (dp[l][r] == 0) {
  25. cout << s.substr(l, (r - l + 1));
  26. return;
  27. }
  28. if (ep[l][r] == -1) {
  29. cout << s[l];
  30. rec(l + 1, r - 1);
  31. cout << s[r];
  32. return;
  33. }
  34. rec(l, ep[l][r]);
  35. rec(ep[l][r] + 1, r);
  36. }
  37.  
  38. signed main() {
  39. cin >> s;
  40.  
  41. int n = s.size();
  42. for (int r = 0; r < n; ++r)
  43. for (int l = r; l >= 0; --l) {
  44. if (l == r)
  45. dp[l][r] = 1;
  46. else {
  47. int best = 1000000; int mk = -1;
  48. if (s[l] == '(' && s[r] == ')' || s[l] == '[' &&
  49. s[r] == ']' || s[l] == '{' && s[r] == '}')
  50.  
  51. best = dp[l + 1][r - 1];
  52. for (int k = l; k < r; ++k)
  53. if (dp[l][k] + dp[k + 1][r] < best) {
  54. best = dp[l][k] + dp[k + 1][r];
  55. mk = k;
  56. }
  57. dp[l][r] = best; ep[l][r] = mk;
  58. }
  59. }
  60.  
  61.  
  62. rec(0, n - 1);
  63.  
  64. return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement