poj2955 Brackets 【区间dp】

来源:互联网 发布:mac 虚拟机免费 编辑:程序博客网 时间:2024/05/04 20:51

链接: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)|1using 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;}

0 0
原创粉丝点击