题目:
http://poj.org/problem?id=2955
题意:
求出字符串中匹配的括号个数.
思路:
区间DP.
dp[i][j]: 表示区间j到i匹配的括号数.
AC.
#include <iostream>
#include <cstdio>
#include <map>
#include <cstring>
using namespace std;
char s[105];
int dp[105][105];
map<char, char> m;
void init()
{
m['('] = ')';
m['['] = ']';
}
int main()
{
//freopen("in", "r", stdin);
init();
while(scanf("%s", s+1)) {
if(s[1] == 'e') break;
int n = strlen(s+1);
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; ++i) {
for(int j = i - 1; j >= 1; --j) {
if(s[i] == m[s[j]]) {
dp[i][j] = dp[i-1][j+1]+2;
}
for(int k = i; k > j; --k) { //区间合并最大值!
dp[i][j] = max(dp[i][j], dp[k-1][j]+dp[i][k]);
}
}
}
printf("%d\n", dp[n][1]);
}
return 0;
}