题目链接:http://poj.org/problem?id=2955
题意:求相互匹配的括号个数。
一道简单的区间dp,按常规的套路来写就可以了。
#include <iostream> #include <cstring> #include <string> using namespace std; int dp[110][110]; int main() { string s; while(cin >> s) { if(s[0] == 'e') break; int len = s.size(); memset(dp , 0 , sizeof(dp)); for(int i = 0 ; i < len - 1 ; i++) { if((s[i] == '(' && s[i + 1] == ')') || (s[i] == '[' && s[i + 1] == ']')) { dp[i][i + 1] = 2; } } for(int i = 2 ; i < len ; i++) { for(int j = 0 ; j < len && j + i < len ; j++) { int MAX1 = dp[j + 1][j + i - 1] , MAX2 = dp[j][j + i]; for(int k = j + 1 ; k < i + j - 1 ; k++) { MAX1 = max(MAX1 , dp[j + 1][k] + dp[k + 1][i + j - 1]); } if((s[j] == '(' && s[i + j] == ')') || (s[j] == '[' && s[i + j] == ']')) { MAX1 += 2; } for(int k = j ; k < i + j ; k++) { MAX2 = max(MAX2 , dp[j][k] + dp[k + 1][i + j]); } dp[j][j + i] = max(MAX1 , MAX2); } } cout << dp[0][len - 1] << endl; } return 0; }