题目链接:点击打开链接
#include<stdio.h>
#include<string.h>
#include<stack>
#define N 110
#define inf 110000
using namespace std;
int dp[N][N];
char str[N];
int min(int a,int b){return a<b?a:b;}
int ok(int x,int y)
{
if(str[x]=='('&&str[y]==')')return 1;
if(str[x]=='['&&str[y]==']')return 1;
return 0;
}
int solve()
{
int i,j,k,len;
len=strlen(str);
memset(dp,0,sizeof(dp));//为了让dp[i][j](当i>j时)为0;
for(i=0;i<len;i++)
for(j=i;j<len;j++)
{
if(i==j)
{dp[i][j]=1; continue;}
dp[i][j]=inf;
}
for(i=len-1;i>=0;i--)
{
for(j=i;j<=len-1;j++)
{
for(k=i;k<=j;k++)
{
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
}
if(ok(i,j)) dp[i][j]=min(dp[i][j],dp[i+1][j-1]);//如果i和j位置是否是一对匹配的括号
}
}
return dp[0][len-1];
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
int ans=solve();
printf("%d\n",ans);
}
return 0;
}