POJ 2955 Brackets 区间DP
题目链接:
POJ 2955 Brackets
题意:求字符串中匹配的括号数*2,字符串长度<100。
分析:区间DP入门题,dp[i][j] 表示区间[i, j]匹配数 *2
写出状态方程:
if(i, j匹配)
dp[i][j] = dp[i + 1][j - 1] + 2;
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
#include <cmath>
#include <queue>
#include <vector>
#include <cstdio>
#include <string>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <algorithm>
using namespace std;
using namespace std;
#define FIN freopen("input.txt","r",stdin)
#define FOUT freopen("output.txt","w",stdout)
#define fst first
#define snd second
const int MAXN = 100 + 5;
int T, N;
char S[MAXN];
int dp[MAXN][MAXN];
inline bool check(int i, int j) {
return (S[i] == '(' && S[j] == ')') || (S[i] == '[' && S[j] == ']');
}
int main() {
#ifndef ONLINE_JUDGE
FIN;
// FOUT;
#endif // ONLINE_JUDGE
int len = 0;
while(~scanf("%s", S)) {
if(S[0] == 'e') break;
len = strlen(S);
memset(dp, 0, sizeof(dp));
for(int ilen = 1; ilen <= len; ilen++) {
for(int i = 0, j; i <= len - ilen; i++) {
j = i + ilen - 1;
if(check(i, j))
dp[i][j] = dp[i + 1][j - 1] + 2;
for(int k = i; k + 1 <= j; k++) {
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
}
}
}
printf("%d\n", dp[0][len - 1]);
}
return 0;
}