Guest User

Untitled

a guest
Nov 16th, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include<vector>
  4. #include<map>
  5. #include<set>
  6. #include<algorithm>
  7. #include<string>
  8. #include <queue>
  9. #include<stack>
  10. #include<deque>
  11. #include<fstream>
  12. using namespace std;
  13. ifstream fin("input.txt");
  14. ofstream fout("output.txt");
  15. int dp[103][103];
  16. string ss[103][103];
  17. bool isa(char a, char b) /// Проверка валиности двух скобок
  18. {
  19. if (a == '['&&b == ']')
  20. return true;
  21. if (a == '('&&b == ')')
  22. return true;
  23. if (a == '{'&&b == '}')
  24. return true;
  25. return false;
  26. }
  27. bool combo(char a, char b, char c, char g)
  28. {
  29. return (isa(a, b) && isa(c, g));
  30. }
  31. int main()
  32. {
  33.  
  34. string s;
  35. fin >> s;
  36. int n;
  37. n = s.size();
  38. int ansmax = 0;
  39. string ans;
  40. for (int i = 1; i <= n; i++) /// i представляет собой : длину разбираемой последовательности минус 1.
  41. {
  42. for (int j = 0; j < n - i; j++) /// j - стартовая точка
  43. {
  44. int mx = 0; /// нахуй не нужная переенная
  45. /// ( { ( ) ) - возьмем к примеру такую скбчн послед
  46. for (int l = j; l < j + i; l++) /// перебираем так называемый разделитель последовательностей. Допустим это будет символ X
  47. {
  48. /// так как разделитель делит на 2 составные ,ему нужно как минимум 4 скобки -> ( { X ( ) )
  49. int r = l + 1;
  50. if (l == j) /// Но если наш раздедитель отделяет только первую скобку , то тут требуется костыль ( X { ( ) )
  51. {
  52. if (dp[r][j + i] > dp[j][j + i]) /// Можно заметить , что тут нет проверки на валидность скобок , так как , к примеру , для отрезка 2-6 , ответ будет () ---- мы его получаем в 80 строчке в дп
  53. {
  54. dp[j][j + i] = dp[r][j + i];
  55. ss[j][j + i] = ss[r][j + i];
  56.  
  57. }
  58.  
  59. }
  60. if (r == j + i) /// тоже самое с послдней скобкой ( { ( ) X )
  61. {
  62.  
  63. if (dp[j][l] > dp[j][j + i])
  64. {
  65. dp[j][j + i] = dp[j][l];
  66. ss[j][j + i] = ss[j][l];
  67. }
  68.  
  69. }
  70.  
  71. if (dp[j][l] + dp[r][j + i] > dp[j][j + i]) /// Теперь нормальная ситуация
  72. { /// Пример для перебора разделителя на последнем шагу : ( { X ( ) ) , ( { ( X ) )
  73. dp[j][j + i] = dp[j][l] + dp[r][j + i];
  74. ss[j][j + i] = ss[j][l] + ss[r][j + i];
  75. }
  76. /// К примеру : ( { X ( ) ) предполагает что мы обьеденим
  77. /// --- эту часть
  78. /// ---- и эту , получив общий ответ для дух отрезков : "" + "()"
  79. }
  80. /// последняя часть, на которой и строится решение
  81. if (dp[j + 1][j + i - 1] + isa(s[j], s[j + i]) > dp[j][j + i]) { /// Ответ для нашего отрезка - это ответ для отрезка с длинной -2 ( dp[j+1][j+i-1] и +1 в случае
  82. ///если наша скобочная последовательность валидна
  83. dp[j][j + i] = dp[j + 1][j + i - 1] + isa(s[j], s[j + i]); /// добовляем к ответу
  84. ss[j][j + i] = ss[j + 1][j + i - 1]; /// И ответ для этой строки , это ответ для отрезка l+1, r-1
  85. if (isa(s[j], s[j + i])) /// однако , если наши боковые скобки валидны
  86. {
  87. ss[j][j + i] = "";/// то
  88. ss[j][j + i] += s[j] + ss[j + 1][j + i - 1];/// мы их и добовляем с дух сторон
  89. ss[j][j + i] += s[j + i];
  90. }
  91. /// Тем самым , после этого действися ,
  92. /*
  93. последоватенльности будут равны
  94. ( ) ==( )
  95. {( ) ==( )
  96. {( )]==( )
  97. а при [ { ( ) ] ] ответом будет === [ ( ) ]
  98. только при помощи этого дейстия
  99. -----
  100. тогда , исходя из всего того , что было выше
  101. мы будем знать для любого l и r самую большу правильную последовательность
  102. ( ) == ( )
  103. { ( ) = = ( )
  104. { ( ) X { ( ) == ( ) + ( ) && ( ) X { ( ) == ()+()
  105.  
  106. { ( ) { ( ) } == ( ) { ( ) == "{"+( )+( )+"}"
  107. -
  108. */
  109. }
  110.  
  111.  
  112.  
  113.  
  114.  
  115.  
  116. }
  117.  
  118. }
  119. fout << ss[0][n - 1];
  120. cin >> n;
  121. }
Add Comment
Please, Sign In to add comment