您的位置:首页 > 其它

poj2955 Brackets 【区间dp】

2016-07-18 16:16 344 查看
链接:http://poj.org/problem?id=2955

题意:给你一串由“(  )”“[  ]”组成的括号串,现在问你最多的括号匹配。

分析:枚举一个长度,看看这个区间内有多少能匹配的括号,用dp[i][j]表示,s[i]和s[j]能匹配时dp[i][j]=dp[i+1][j-1]+2,然后枚举区间内的点,两段区间合并就可以找到最大的匹配。

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<vector>
#include<queue>
#include<cmath>
#include<stack>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define Mn 110
#define Mm 2000005
#define mod 1000000007
#define CLR(a,b) memset((a),(b),sizeof((a)))
#define CLRS(a,b,Size) memset((a),(b),sizeof((a[0]))*(Size+1))
#define CPY(a,b) memcpy ((a), (b), sizeof((a)))
#pragma comment(linker, "/STACK:102400000,102400000")
#define ul u<<1
#define ur (u<<1)|1
using namespace std;
typedef long long ll;
int dp[Mn][Mn];
int main() {
char s[110];
while(1) {
scanf("%s",s);
if(s[0]=='e') break;
CLR(dp,0);
int len=strlen(s);
for(int k=1;k<len;k++) {
for(int i=0,j=k;j<len;j++,i++) {
if((s[i]=='('&&s[j]==')')||(s[i]=='['&&s[j]==']'))
dp[i][j]=dp[i+1][j-1]+2;
for(int p=i;p<j;p++) {
dp[i][j]=max(dp[i][p]+dp[p+1][j],dp[i][j]);
}
}
}
printf("%d\n",dp[0][len-1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: