给你一些括号,类似于
((]))
[[]]
((([[)]])))
这种不是完全匹配的括号,问至少加多少个括号,能使它变成完全匹配的
dp思想,用的是递归的方法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=110;
char tab[maxn];
int f[maxn][maxn];
//f[i][j]是从i 到 j 凑成匹配括号的最小的加括号数
int fun(int i,int j)
{
if(i>j)return 0;
if(f[i][j]>=0)return f[i][j];
if(i==j)return f[i][j]=1;
int va=maxn;
if((tab[i]=='('&&tab[j]==')') || (tab[i]=='['&&tab[j]==']'))
va=fun(i+1,j-1);
for(int mid=i;mid<j;mid++){
va=min(va,fun(i,mid)+fun(mid+1,j));
}
return f[i][j]=va;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
memset(f,-1,sizeof(f));
memset(tab,0,sizeof(tab));
scanf("%s",tab);
cout<<fun(0,strlen(tab)-1)<<endl;
}
}