POJ2955 Brackets(区间DP)

给一个括号序列,求有几个括号是匹配的。

  • dp[i][j]表示序列[i,j]的匹配数
  • dp[i][j]=dp[i+1][j-1]+2(括号i和括号j匹配)
  • dp[i][j]=max(dp[i][k]+dp[k+1][j])(i<=k<j)
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 char str[111];
 6 int d[111][111];
 7 int main(){
 8     while(~scanf("%s",str) && str[0]!='e'){
 9         int n=strlen(str);
10         memset(d,0,sizeof(d));
11         for(int len=2; len<=n; ++len){
12             for(int i=0; i+len<=n; ++i){
13                 if(str[i]=='('&&str[i+len-1]==')' || str[i]=='['&&str[i+len-1]==']') d[i][i+len-1]=d[i+1][i+len-2]+2;
14                 for(int j=0; j<len-1; ++j) d[i][i+len-1]=max(d[i][i+len-1],d[i][i+j]+d[i+j+1][i+len-1]);
15             }
16         }
17         printf("%d\n",d[0][n-1]);
18     }
19     return 0;
20 }

 

posted @ 2016-02-24 21:14  WABoss  阅读(203)  评论(0编辑  收藏  举报