括号配对(类似于【密码脱落】)(区间DP )
Hecy 又接了个新任务:BE 处理。
BE 中有一类被称为 GBE。
以下是 GBE 的定义:
空表达式是 GBE
如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE
如果 A 与 B 都是 GBE,那么 AB 是 GBE
下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。
注意:BE 是一个仅由(、)、[、]四种字符中的若干种构成的字符串。
输入格式
输入仅一行,为字符串 BE。
输出格式
输出仅一个整数,表示增加的最少字符数。
数据范围
对于所有输入字符串,其长度小于100。
输入样例:
[])
输出样例:
1
分析
代码
区间DP问题先枚举区间长度 ,再枚举左右 i j
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 110;
int INF = 1e8;
int f[N][N];
int n;
bool is_match(char l,char r)
{
if(l == '(' && r == ')') return true;
if(l == '[' && r == ']') return true;
return false;
}
int main()
{
string s;
cin >> s;
n = s.size();
for(int len = 1;len <= n;len++)
for(int i = 0;i + len - 1 < n;i++)
{
int j = len + i - 1;
f[i][j] = INF;
if(is_match(s[i],s[j]))
f[i][j] = f[i + 1][j - 1];
f[i][j] = min(f[i][j],min(f[i + 1][j],f[i][j - 1]) + 1);
for(int k = i;k < j;k++)
f[i][j] = min(f[i][j],f[i][k] + f[k + 1][j]);
}
cout << f[0][n - 1] << endl;
return 0;
}