Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define int long long
- const long long INF = 1e18 + 7;
- const int MAXN = 1e2 + 100;
- const int N = 1e5 + 10;
- array<array<int, MAXN>, MAXN> dp, p;
- string s;
- bool match(char a, char b) {
- return a == '(' && b == ')' || a == '[' && b == ']' || a == '{' && b == '}';
- }
- void rec(int l, int r) {
- // cout << l << ' ' << r << endl;
- if (l > r || dp[l][r] == r - l + 1) {
- return;
- }
- if (p[l][r] != -INF) {
- rec(l, p[l][r]);
- rec(p[l][r] + 1, r);
- } else if (p[l][r] == -INF) {
- cout << s[l];
- rec(l + 1, r - 1);
- cout << s[r];
- return;
- }
- }
- signed main() {
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- cin >> s;
- int n = s.size();
- for (int i = 0; i < n; ++i) {
- for (int j = 0; j < n; ++j) {
- dp[i][j] = INF;
- p[i][j] = -INF;
- }
- }
- for (int i = 0; i < n - 1; ++i) {
- dp[i][i] = 1;
- dp[i][i + 1] = 2 * (!match(s[i], s[i + 1]));
- }
- dp[n - 1][n - 1] = 1;
- for (int len = 2; len < n; ++len) {
- for (int l = 0; l + len < n; ++l) {
- int r = l + len;
- dp[l][r] = dp[l + 1][r - 1] + (match(s[l], s[r])? 0 : INF);
- for (int m = l; m < r; ++m) {
- if (dp[l][r] > dp[l][m] + dp[m + 1][r]) {
- dp[l][r] = dp[l][m] + dp[m + 1][r];
- p[l][r] = m;
- }
- }
- }
- }
- rec(0, n - 1);
- }
Advertisement
Add Comment
Please, Sign In to add comment