http://poj.org/problem?id=2955
题意:给出一串字符,求括号匹配的数最多是多少。
思路:区间DP。
对于每个枚举的区间边界,如果两边可以配对成括号,那么dp[i][j] = dp[i+1][j-1] + 2,表示由上一个状态加上当前的贡献。
然后和普通的区间合并一样去更新。
1 #include <cstring> 2 #include <cstdio> 3 #include <iostream> 4 #include <string> 5 using namespace std; 6 #define N 105 7 int dp[105][105]; 8 string s; 9 10 int main() { 11 while(cin >> s) { 12 if(s == "end") break; 13 int n = s.length(); 14 memset(dp, 0, sizeof(dp)); 15 for(int len = 1; len < n; len++) { 16 for(int i = 0; i + len < n; i++) { 17 int j = i + len; 18 if(s[i] == ‘(‘ && s[j] == ‘)‘ || s[i] == ‘[‘ && s[j] == ‘]‘) dp[i][j] = 2 + dp[i+1][j-1]; 19 for(int k = i; k < j; k++) 20 if(dp[i][j] < dp[i][k] + dp[k+1][j]) dp[i][j] = dp[i][k] + dp[k+1][j]; 21 } 22 } 23 printf("%d\n", dp[0][n-1]); 24 } 25 return 0; 26 }
时间: 2024-10-12 20:10:48