训练题
Hecy 又接了个新任务:BE 处理。BE 中有一类被称为 GBE。
以下是 GBE 的定义:
空表达式是 GBE
如果表达式 A 是 GBE,则 [A] 与 (A) 都是 GBE
如果 A 与 B 都是 GBE,那么 AB 是 GBE
下面给出一个 BE,求至少添加多少字符能使这个 BE 成为 GBE。
输入格式
输入仅一行,为字符串 BE。
输出格式
输出仅一个整数,表示增加的最少字符数。
#include<iostream>
#include<cstdio>
#include<istream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[120][120];
int main()
{
int i,j,k;
string s;
// gets(s); 用这个会编译错误
getline(cin,s);
int l=s.size();
for(i=1; i<l; i++) //长度 枚举长度
{
for(j=0; j+i<l; j++)//起点
{
int l=j;
int r=j+i;//终点
if((s[l]=='('&&s[r]==')')||(s[l]=='['&&s[r]==']'))//起点和终点相同 就可以加上2
dp[l][r]=dp[l+1][r-1]+2;
for(k=l; k<r; k++)//枚举中间的那个断点
{
dp[l][r]=max(dp[l][r],dp[l][k]+dp[k][r]);
}
}
}
printf("%d\n",l-dp[0][l-1]);//长度减掉这个字符串所能匹配的最大长度
return 0;
}