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

POJ 2955:Brackets 区间DP基础题

时间:2016-08-07 16:47:53      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:

Brackets

题目链接:

http://poj.org/problem?id=2955

题意:

给出一个只由‘(‘、‘)‘、‘[‘、‘]‘构成的字符串,字符间可以匹配,左边的 ‘(‘ 可以与右边的 ‘)‘ 匹配,左边的 ‘[‘ 可以与右边的 ‘]‘ 匹配

两种匹配不能交叉,可以包含,如 [(])只算2个匹配而[()]算四个匹配,求最大匹配数。

 

题解:

设dp[i][j]为区间 i 到 j (设len为区间长度,j=i+len)内可以得到的最大匹配数,则有两种情况:

        ① j 不与区间[i,j]内的任意一个字符匹配 dp[i][j]=dp[i][j-1]

        ② 可以在区间[i,j]内找到一个点k使得 k 上的字符可以与 j 上的字符匹配,此时dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k+1][j-1]+2)

 

代码

#include<stdio.h>
#include<string.h>
const int N=110;
int dp[N][N];
char s[N]; 
int mmax(int x,int y)
{
	return x>y?x:y;
}
char Get_c(char c)
{
	if(c==‘)‘)return ‘(‘;
	if(c==‘]‘)return ‘[‘;
	return ‘!‘;
}
void solve()
{
	memset(dp,0,sizeof(dp));
	while(~scanf("%s",s+1)&&s[1]!=‘e‘)
	{
		s[0]=‘?‘;
		int t=strlen(s);
		for(int len=1;len<t;++len)
		for(int i=1;i+len<=t;++i)
		{
			int j=i+len;
			char c=Get_c(s[j]);
			dp[i][j]=dp[i][j-1];
			for(int k=i;k<j;++k)
			if(s[k]==c)
			{
				dp[i][j]=mmax(dp[i][j],dp[i][k-1]+dp[k+1][j-1]+2);
			}
		}
		printf("%d\n",dp[1][t]);
	}
}
int main()
{
	solve();
	return 0;
}

POJ 2955:Brackets 区间DP基础题

标签:

原文地址:http://www.cnblogs.com/kiuhghcsc/p/5746399.html

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