POJ 2955 Brackets 区间合并

输出一个串里面能匹配的括号数

状态转移方程:

if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']')
             dp[i][j]=dp[i+1][j-1]+2;

然后再区间合并

 1 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<queue>
 7 #include<stack>
 8 #include<cmath>
 9 #include<set>
10 #include<algorithm>
11 #include<vector>
12 // #include<malloc.h>
13 using namespace std;
14 #define clc(a,b) memset(a,b,sizeof(a))
15 #define LL long long
16 const int inf = 0x3f3f3f3f;
17 const double eps = 1e-5;
18 const double pi = acos(-1);
19 // inline int r(){
20 //     int x=0,f=1;char ch=getchar();
21 //     while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
22 //     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
23 //     return x*f;
24 // }
25 int dp[110][110];
26 char s[110];
27 int main(){
28     // freopen("in.txt","r",stdin);
29     while(gets(s)!=NULL){
30        if(s[0]=='e') break;
31        // cout<<s<<endl;
32        int len=strlen(s);
33        clc(dp,0);
34        for(int i=len-2;i>=0;i--){
35         for(int j=i+1;j<len;j++){
36             if(s[i]=='('&&s[j]==')'||s[i]=='['&&s[j]==']')
37                 dp[i][j]=dp[i+1][j-1]+2;
38             for(int k=i;k<j;k++)//区间合并
39                 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
40         }
41        }
42        printf("%d\n",dp[0][len-1]);
43     }
44     return 0;
45 }

 

posted @ 2016-05-10 11:45  yyblues  阅读(227)  评论(0编辑  收藏  举报