#这道题搜不到题解.md
#只搜到一个只有方程的题解.avi
#就自己写个题解.asdjhadskj
这道题是这样的
设
表示
到
区间内所补全所需的最小值
那么我们设置一个断点
则
意思是,将
到
、
到
拼起来得到的最小的补全个数
还有,如果有字串
,在
的外面加一对括号,那么
的补全数不变
即
source:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define inf 0x7fffffff/2
int f[105][105];
char a[106];
bool check(char a, char b){
if(a == '(' && b == ')') return 1;
if(a == '[' && b == ']') return 1;
return 0;
}
int main(int argc, char const *argv[]){
freopen("gbe.in","r",stdin);
scanf("%s",a+1);
int n=strlen(a+1);
for(int i=1;i<=n;i++)
f[i][i]=1;
for(int L=2;L<=n;L++)
{
for(int i=1;i<=n-L+1;i++)
{
int j=i+L-1;
f[i][j]=0x3f3f3f3f;
for(int k=i;k<=j;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]);
if(check(a[i],a[j])) f[i][j]=min(f[i][j],f[i+1][j-1]);
}
}
printf("%d",f[1][n]);
return 0;
}