1 /*参考 DP 中的 15题*/ 
 2 #include<iostream>
 3 #include<cstring>
 4 #define min(x,y) x<y?x:y
 5 using namespace std;
 6 int num[110][110];
 7 char ch[110];
 8 int comp(int i,int j)
 9 {
10    if(ch[i]=='('&&ch[j]==')')return 1;
11    if(ch[i]=='['&&ch[j]==']')return 1;
12    return 0;
13 }
14 int recur(int i,int j)
15 {
16    if(i==j)return num[i][j]=1;
17    if(num[i][j]>=0)return num[i][j];//num[][]初始化时为-1不能为0,若为零则由此返回不能更新了 
18    if(i>j)return 0;
19    int va=110,k;
20    if(comp(i,j))
21     {
22        //if(j-1<i+1)va=0;
23 // else va=recur(i+1,j-1);
24       va=recur(i+1,j-1);
25     }
26    for(k=i;k<j;++k)
27     va=min(va,recur(i,k)+recur(k+1,j));
28     num[i][j]=va;
29     return va;
30 }
31 int main()
32 {
33    int i,t,len;
34    cin>>t;
35    while(t--)
36    {
37      cin>>ch;
38      len=strlen(ch);
39      memset(num,-1,sizeof(num));
40      cout<<recur(0,len-1)<<endl;
41    }
42    system("pause");
43    return 0;
44 }