NYOJ 15 (递归)
View Code
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 }