括号序列

题目描述

定义一个合法的括号序列

  • 空序列合法
  • 如果S合法,那么(S)和[S]合法
  • 假设A和B合法,那么AB合法

合法序列 - (),[],(()),([]),()[],()[()]

非法序列 - (,[,],)(, (]),([(),([)]

给定一个序列,求最少添加多少个括号,才能得到一个合法序列。

输入描述

输入仅一行,为一个字符串SS,1len(S)1001\leq len(S)\leq 100

输出描述

输出只有一个整数,表示增加的最少字符数。

测试用例

输入

[])

输出

1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 200
#define INF 0x3f3f3f3f3f3f3f3f
ll dp[MAXN][MAXN];
string s;
int main() {
    cin >> s;
    ll n = s.size();
    for (ll i = 1; i <= n; i++)
        dp[i][i] = 1;
    for (ll l = 2; l <= n; l++)
        for (ll i = 1; i <= n - l + 1; ++i) {
            ll j = l + i - 1;
            dp[i][j] = INF;
            for (ll k = i; k <= j - 1; k++)
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
            if ((s[i - 1] == '(' && s[j - 1] == ')') || (s[i - 1] == '[' && s[j - 1] == ']'))
                dp[i][j] = min(dp[i + 1][j - 1], dp[i][j]);
        }
    cout << dp[1][n];
    return 0;
}