http://poj.org/problem?id=2955
数组开的大了就一直TLE, 不知道为什么,,,
状态定义为
dp[i][j]编号i到编号j的括号的最大匹配数目
d
p
[
i
]
[
j
]
编
号
i
到
编
号
j
的
括
号
的
最
大
匹
配
数
目
区间dp 每次枚举i-j之间的最大匹配数目
状态转移方程为
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a, (b), sizeof(a))
const int MAXN = 2e2+10;
int dp[MAXN][MAXN];
char str[MAXN];
int main(int argc, char const *argv[])
{
while(~scanf("%s",str+1)&&str[1]!='e') {
int n = strlen(str+1);
CLR(dp, 0);
for(int len = 1; len < n; ++len) {
for(int i = 1; i <= n; ++i) {
int j = len+i;
if(j > n) break;
if(str[i]=='('&& str[j]==')' || str[i]=='['&&str[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[i][k]+dp[k+1][j]);
}
}
printf("%d\n", dp[1][n]);
}
return 0;
}