题意:给你一个含有'(' ,')' ,'[',']',四个符号的字符串,问你最少加多少个符号才能使得括号匹配.

解题思路:DP,DP[i][j]表示i-j最少需要多少个括号才能匹配,一级一级的DP,就可以得出答案..

ps:不想吐嘈黑书115页那个错误代码了

解题代码:

 1 #include<vector>
 2 #include<list>
 3 #include<map>
 4 #include<set>
 5 #include<deque>
 6 #include<stack>
 7 #include<bitset>
 8 #include<algorithm>
 9 #include<functional>
10 #include<numeric>
11 #include<utility>
12 #include<sstream>
13 #include<iostream>
14 #include<iomanip>
15 #include<cstdio>
16 #include<cmath>
17 #include<cstdlib>
18 #include<cstring>
19 #include<ctime>
20 #include<climits>
21 
22 using namespace std;
23 int dp[200][200];
24 int Min(int a, int b)
25 {
26     if(a < b)
27         return a ;
28     return b;
29 }
30 int main(){
31 
32     int t;
33     scanf("%d",&t);
34     while(t -- ){
35       memset(dp,0,sizeof(dp));
36       char str[200];
37       scanf("%s",str);
38       int n = strlen(str);
39       for(int i = 1;i <= n;i ++)
40           dp[i][i-1] =0 ; 
41       for(int i = 1;i<= n;i++)
42           dp[i][i] = 1; 
43       for(int p = 1;p < n;p ++ ){
44           
45           for(int i = 0 ; i < n-p; i ++){
46               int j = i + p;
47               dp[i+1][j+1] = 100000;
48               if((str[i] == '(' && str[j] == ')') || (str[i] == '[' && str[j] == ']'))
49                 dp[i+1][j+1] = Min(dp[i+1][j+1],dp[i+2][j]);
50               if(str[i] == '(' || str[i] == '[')
51                 dp[i+1][j+1] = Min(dp[i+1][j+1],dp[i+2][j+1]+1);
52               if(str[j] == ')' || str[j] == ']')
53                 dp[i+1][j+1] = Min(dp[i+1][j+1],dp[i+1][j]+1);
54               for(int k = i ;k <= j -1;k ++)
55                 dp[i+1][j+1] = Min(dp[i+1][j+1],dp[i+1][k+1]+dp[k+2][j+1]);
56           
57           }
58       
59       }
60       printf("%d\n",dp[1][n]);
61     }
62 
63     return 0;
64 }
View Code

 

posted on 2014-04-26 20:14  dark_dream  阅读(187)  评论(0编辑  收藏  举报