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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 " , a[0][len - 1] ) ; 38 } 39 return 0 ; 40 }
区间dp感觉和merge sort有异曲同工之妙
从可行的最小区间出发,逐级上去,最终得到整段区间的最终结。
dp[i][j] 指[i , j]这段区间的最优解