Brackets
Time Limit: 1000MS |
|
Memory Limit: 65536K |
Total Submissions: 3615 |
|
Accepted: 1874 |
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] is 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 is regular brackets sequences:
(), [], (()), ()[], ()[()]
While the following character sequences is not:
(, ], )(, ([)], ([(]
Given a brackets sequence of characters a1a2 ... An, your goal are to find the length of the longest regular brackets sequence, which is a subsequence of s. That's, you wish to find the largest m such this 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 would contain multiple test cases. Each input test case consists of a single line containing only the characters (
, )
, [
, and ]
; each input t EST would have length between 1 and inclusive. The End-of-file is marked by a line containing the word "end" and should not being 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
((())) () () () () ([][][)
Sample Output
66406
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib > #include <string> #include <algorithm>using namespace Std;char s[105];int maxx,dp[105][105];int main () {While (scanf ("%s", s)!=eof) { if (strcmp (S, ' end ') ==0) break ; Memset (Dp,0,sizeof (DP)); maxx=0; int Len=strlen (s); for (int i=0;i<len;i++) {for (int j=0,k=i;k<len;j++,k++) { if ((s[j]== ') (' &&s[k]== ' ) ' | | (s[j]== ' [' &&s[k]== '] )) dp[j][k]=dp[j+1][k-1]+2; for (int t=j+1;t<k;t++) { if (dp[j][t]+dp[t][k]>dp[j][k]) dp[j][k]=dp[j][t]+dp[t][k]; } if (Dp[j][k]>maxx) maxx=dp[j][k]; } } printf ("%d\n", Maxx); } return 0;}
(interval type DP) POJ 2955