Brackets(区间dp)

Brackets
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 3624   Accepted: 1879

Description

We give the following inductive definition of a “regular brackets” sequence:

  • the empty sequence is a regular brackets sequence,
  • if s is a regular brackets sequence, then (s) and [s] are regular brackets sequences, and
  • if a and b are regular brackets sequences, then ab is a regular brackets sequence.
  • no other sequence is a regular brackets sequence

For instance, all of the following character sequences are regular brackets sequences:

(), [], (()), ()[], ()[()]

while the following character sequences are not:

(, ], )(, ([)], ([(]

Given a brackets sequence of characters a1a2 … an, your goal is to find the length of the longest regular brackets sequence that is a subsequence of s. That is, you wish to find the largest m such that for indices i1, i2, …, imwhere 1 ≤ i1 < i2 < … < im ≤ n, ai1ai2 … aim is a regular brackets sequence.

Given the initial sequence ([([]])], the longest regular brackets subsequence is [([])].

Input

The input test file will contain multiple test cases. Each input test case consists of a single line containing only the characters (, ), [, and ]; each input test will have length between 1 and 100, inclusive. The end-of-file is marked by a line containing the word “end” and should not be processed.

Output

For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line.

Sample Input

((()))
()()()
([]])
)[)(
([][][)
end

Sample Output

6
6
4
0
6

Source

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<string.h>
 4 using namespace std;
 5 char st[150] ;
 6 int a[110][110] ;
 7 
 8 bool check (int a , int b)
 9 {
10     if (st[a] == '(' && st[b] == ')' )
11         return 1 ;
12     if (st[a] == '[' && st[b] == ']' )
13         return 1 ;
14     return 0 ;
15 }
16 
17 int main ()
18 {
19    // freopen ("a.txt" , "r" , stdin ) ;
20     while (1) {
21         gets (st) ;
22         if (strcmp (st , "end") == 0)
23             break ;
24         memset (a , 0 , sizeof(a) ) ;
25         int len = strlen (st) ;
26         for (int o = 2 ; o <= len ; o++) {
27             for (int i = 0 ;  i < len - o + 1; i++) {
28                 int j = i + o ;
29                 for (int k = i ; k < j ; k++ ) {
30                     a[i][j - 1] = max (a[i][j - 1] , a[i][k] + a[k + 1][j - 1] ) ;
31                     if (check (i , j - 1) ) {
32                         a[i][j - 1] = max (a[i][j - 1] , a[i + 1][j - 1 - 1] + 2 ) ;
33                     }
34                 }
35             }
36         }
37         printf ("%d\n" , a[0][len - 1] ) ;
38     }
39     return 0 ;
40 }
View Code

区间dp感觉和merge sort有异曲同工之妙
从可行的最小区间出发,逐级上去,最终得到整段区间的最终结。

dp[i][j] 指[i , j]这段区间的最优解

posted @ 2015-03-18 21:13  92度的苍蓝  阅读(238)  评论(0)    收藏  举报
http://images.cnblogs.com/cnblogs_com/Running-Time/724426/o_b74124f376fc157f352acc88.jpg