题目链接: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;
}