码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2955 Brackets 区间DP

时间:2014-07-21 14:07:05      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:http   io   for   re   html   c   

题目来源: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

POJ 2955 Brackets 区间DP

标签:http   io   for   re   html   c   

原文地址:http://blog.csdn.net/u011686226/article/details/38015277

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!