括号配对

题目描述 

Hecy又接了个新任务:BE处理。BE中有一类被称为GBE。
以下是GBE的定义:
  1. 空表达式是GBE
  2. 如果表达式A是GBE,则[A]与(A)都是GBE
  3. 如果A与B都是GBE,那么AB是GBE下面给出一个BE,
求至少添加多少字符能使这个BE成为GBE。

输入描述:

输入仅一行,为字符串BE。

输出描述:

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

输入

[])

输出

1
#include<bits/stdc++.h>
using namespace std;
const int N = 1e2 + 7;
char s[N]; int dp[N][N];
int main() {
    scanf("%s", s + 1);
    int n = strlen(s + 1);
    memset(dp, 0, sizeof(dp));
    for (int len = 2; len <= n; len++) {
        for (int l = 1; l <= n - len + 1; l++) {
            int r = l + len - 1;
            if ((s[l] == '(' && s[r] == ')') || (s[l] == '[' && s[r] == ']'))
                    dp[l][r] = max(dp[l][r], dp[l + 1][r - 1] + 2);
            for (int k = l; k < r; k++) {
                dp[l][r] = max(dp[l][r], dp[l][k] + dp[k + 1][r]);
            }
        }
    }
    cout << n - dp[1][n] << endl;
    return 0;
}

 

posted @ 2020-07-17 08:27  HighLights  阅读(223)  评论(0)    收藏  举报