题意:给你一个含有'(' ,')' ,'[',']',四个符号的字符串,问你最少加多少个符号才能使得括号匹配.
解题思路: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 }