Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。
以下是 GBE 的定义:
- 空表达式是 GBE
- 如果表达式
A
是 GBE,则[A]
与(A)
都是 GBE - 如果
A
与B
都是 GBE,那么AB
是 GBE
下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。
思路:
区间dp形式一般是固定的,三层for循环:最外层循环长度,中间层循环 左边界,最里层循环枚举左右边界之间,寻找最适中间点
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+3,inf=0x3f3f3f3f;
int a[N][N];
string s;
bool mat_ch(char cc,char c)
{
if(cc=='['&&c==']')return true;
if(cc=='('&&c==')')return true;
return false;
}
int main()
{
cin>>s;
int n=s.size();
for(int l=1;l<=n;l++)//如果不进行到 n ,那么如果输入的只有一个字符 ( ,将无法进行计算,
{ //补充 进行到 n,是可以进行到的最小范围,往上不限,只要运行不超时
for(int i=0;i+l<=n;i++)
{
int j=i+l-1; //如果不 -1 ,无法对 i-i 赋初值 ,那么无论怎么计算,最后结果只会是 0
a[i][j]=inf;
if(mat_ch(s[i],s[j])) a[i][j]=a[i+1][j-1];
a[i][j]=min(a[i][j],min(a[i+1][j],a[i][j-1])+1);
for(int k=i;k<j;k++)
a[i][j]=min(a[i][j],a[i][k]+a[k+1][j]);
}
}
cout<<a[0][n-1];
return 0;
}