您的位置:首页 > 其它

poj 2955 Brackets(区间dp)

2017-07-23 14:40 495 查看
题目链接:poj2955

题目大意:给出一个字符串,进行括号的匹配。 (和),[和],两对括号,问一个字符串中最对有几个括号是互相匹配的

思路:简单的区间dp问题  o(n^3)的复杂的

第一层循环枚举区间的长度,第二层循环是这个区间的起始点,第三个循环是这个区间的内的间断点。

#include<iostream>
#include<iostream>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cstdio>
using namespace std;
#define maxn 200
char s[maxn];
int dp[maxn][maxn];
int getmatch(int i,int j)
{
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))return 2;
else return 0;
}
void solve(int len)
{
memset(dp,0,sizeof dp);
for(int i=0;i<len-1;i++)
dp[i][i+1]=getmatch(i,i+1);
for(int d=2;d<len;d++)
{
for(int i=0,j;(j=i+d)<len;i++)
{
dp[i][j]=dp[i+1][j-1]+getmatch(i,j);
for(int k=i;k<j;k++)
{
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
}
}
}
int main()
{
while(~scanf("%s",s))
{
if(s[0]=='e')break;
int len=strlen(s);
solve(len);
printf("%d\n",dp[0][len-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: