Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- int dp[105][105];
- int ep[105][105];
- char f(char c) {
- if (c == '(') return ')';
- if (c == ')') return '(';
- if (c == '{') return '}';
- if (c == '}') return '{';
- if (c == '[') return ']';
- if (c == ']') return '[';
- }
- string s;
- void rec(int l, int r) {
- if (dp[l][r] == r - l + 1)
- return;
- if (dp[l][r] == 0) {
- cout << s.substr(l, (r - l + 1));
- return;
- }
- if (ep[l][r] == -1) {
- cout << s[l];
- rec(l + 1, r - 1);
- cout << s[r];
- return;
- }
- rec(l, ep[l][r]);
- rec(ep[l][r] + 1, r);
- }
- signed main() {
- cin >> s;
- int n = s.size();
- for (int r = 0; r < n; ++r)
- for (int l = r; l >= 0; --l) {
- if (l == r)
- dp[l][r] = 1;
- else {
- int best = 1000000; int mk = -1;
- if (s[l] == '(' && s[r] == ')' || s[l] == '[' &&
- s[r] == ']' || s[l] == '{' && s[r] == '}')
- best = dp[l + 1][r - 1];
- for (int k = l; k < r; ++k)
- if (dp[l][k] + dp[k + 1][r] < best) {
- best = dp[l][k] + dp[k + 1][r];
- mk = k;
- }
- dp[l][r] = best; ep[l][r] = mk;
- }
- }
- rec(0, n - 1);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement