题目来源:POJ 2955 Brackets
题意:最大括号匹配
思路:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int maxn = 210;
int dp[maxn][maxn];
char a[maxn];
int b[maxn];
int dfs(int l, int r)
{
if(l > r)
return 0;
if(dp[l][r] != -1)
return dp[l][r];
if(l+1 == r)
{
if(b[l] < 2 && b[l]+b[r] == 3)
dp[l][r] = 1;
else
dp[l][r] = 0;
return dp[l][r];
}
if(l == r)
{
dp[l][r] = 0;
return dp[l][r];
}
dp[l][r] = 0;
if(b[l] < 2 && b[l] + b[r] == 3)
{
dp[l][r] = max(dp[l][r], dfs(l+1, r-1)+1);
}
else
{
dp[l][r] = max(dp[l][r], dfs(l+1, r-1));
}
for(int i = l; i <= r; i++)
{
dp[l][r] = max(dp[l][r], dfs(l, i)+dfs(i+1, r));
}
return dp[l][r];
}
int main()
{
while(gets(a) && (strcmp(a, "end")))
{
memset(dp, -1, sizeof(dp));
for(int i = 0; a[i]; i++)
{
if(a[i] == '(')
b[i] = 0;
else if(a[i] == ')')
b[i] = 3;
else if(a[i] == '[')
b[i] = 1;
else if(a[i] == ']')
b[i] = 2;
}
printf("%d\n", dfs(0, strlen(a)-1)*2);
}
return 0;
}
POJ 2955 Brackets 区间DP,布布扣,bubuko.com
原文地址:http://blog.csdn.net/u011686226/article/details/38015277