POJ 2955 Brackets (区间DP,常规)

 

 

 

题意:

  给出一个字符串,其中仅仅含 “ ( ) [ ] ” 这4钟符号,问最长的合法符号序列有多长?(必须合法的配对,不能混搭)

 

 

思路:

  区间DP的常规问题吧,还是枚举区间[i->j]再枚举其中第k个与第i个来配对,如果配对了就+2这样子。

 

 1 //#include <bits/stdc++.h>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <map>
 7 #include <algorithm>
 8 #include <vector>
 9 #include <iostream>
10 #define pii pair<int,int>
11 #define INF 0x3f3f3f3f
12 #define LL  long long
13 using namespace std;
14 const double PI  = acos(-1.0);
15 const int N=110;
16 char s[N];
17 int dp[N][N];
18 
19 bool ispair(char c1,char c2)
20 {
21     if( c1=='('&&c2==')' )   return true;
22     if( c1=='['&&c2==']' )   return true;
23     return false;
24 }
25 
26 int cal(int n)
27 {
28     memset(dp, 0, sizeof(dp));
29     for(int j=2; j<=n; j++ )
30     {
31         for(int i=j-1; i>0; i--)
32         {
33             dp[i][j]=dp[i+1][j];
34             for(int k=i+1; k<=j; k++)   //枚举与s[i]配对的另一半括号
35             {
36                 if( ispair(s[i],s[k]) )
37                     dp[i][j]=max( dp[i][j], dp[i+1][k-1]+dp[k+1][j]+1  );
38             }
39         }
40     }
41     return dp[1][n]<<1;
42 }
43 
44 int main()
45 {
46     //freopen("input.txt", "r", stdin);
47     while(1)
48     {
49         gets(s+1);
50         if(s[1]=='e')   break;
51         printf("%d\n", cal(strlen(s+1)));
52 
53     }
54     return 0;
55 }
AC代码

 

posted @ 2015-09-26 21:24  xcw0754  阅读(152)  评论(0编辑  收藏  举报