标签:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6622 | Accepted: 3558 |
We give the following inductive definition of 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 [([])]
.
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.
For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line.
((()))
()()()
([]])
)[)(
([][][)
end
6
6
4
0
6
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 const int maxn = 105; 5 char str[maxn]; 6 int dp[maxn][maxn]; 7 8 bool match(char a, char b){ 9 return (a==‘(‘&&b==‘)‘) || (a==‘[‘&&b==‘]‘); 10 } 11 12 int dfs(int l, int r){ 13 if (l >= r) 14 return 0; 15 if (l+1 == r) 16 return dp[l][r] = match(str[l], str[r]); 17 if (dp[l][r]) 18 return dp[l][r]; 19 int ans = dfs(l+1, r); 20 for (int i=l; i<=r; ++i) 21 if (match(str[l], str[i])){ 22 int t = dfs(l+1, i-1)+dfs(i+1, r)+1; 23 if (t > ans) 24 ans = t; 25 } 26 return dp[l][r] = ans; 27 } 28 29 int main(){ 30 while (~scanf("%s", str) && str[0]!=‘e‘){ 31 memset(dp, 0, sizeof(dp)); 32 int len = strlen(str); 33 dfs(0, len-1); 34 printf("%d\n", 2*dp[0][len-1]); 35 } 36 return 0; 37 }
标签:
原文地址:http://www.cnblogs.com/Silenceneo-xw/p/5936944.html