Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6033 | Accepted: 3220 |
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, …,im where 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 /****************************** 2 code by drizzle 3 blog: www.cnblogs.com/hsd-/ 4 ^ ^ ^ ^ 5 O O 6 ******************************/ 7 //#include<bits/stdc++.h> 8 #include<iostream> 9 #include<cstring> 10 #include<cstdio> 11 #include<map> 12 #include<algorithm> 13 #include<cmath> 14 #define ll __int64 15 #define PI acos(-1.0) 16 #define mod 1000000007 17 char a[105]; 18 int dp[105][105]; 19 using namespace std; 20 int main() 21 { 22 while(gets(a)) 23 { 24 if(a[0]=='e') 25 break; 26 int len=strlen(a); 27 memset(dp,0,sizeof(dp)); 28 /*for(int i=0; i<len-1; i++) 29 { 30 if(((a[i]=='(')&&(a[i+1]==')'))||((a[i]=='[')&&(a[i+1]==']')))//边界处理 31 dp[i][i+1]=2; 32 }*/此处删去仍然可以 ac 细细想一下 其实这个边界 已经在下面的if中处理掉了 33 for(int i=len-1; i>=0; i--) 34 { 35 for(int j=i+1; j<=len-1; j++) 36 { 37 for(int k=i; k<=j; k++) 38 dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]); 39 if(((a[i]=='(')&&(a[j]==')'))||((a[i]=='[')&&(a[j]==']'))) 40 dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2); 41 } 42 } 43 cout<<dp[0][len-1]<<endl;; 44 } 45 return 0; 46 }