Brackets
Time Limit:1000MSMemory Limit:65536K
Total Submissions:3571Accepted:1847
Description
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 charactersa1a2…an, your goal is to find the length of the longest regular brackets sequence that is a subsequence ofs. That is, you wish to find the largestmsuch that for indicesi1,i2, …,imwhere 1 ≤i1<i2< … <im≤n,ai1ai2…aimis 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
66406
Source
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 105char a[N];int dp[N][N];int main(){while(scanf("%s",a)&&a[0]!='e'){ memset(dp,0,sizeof(dp)); int len=strlen(a); for(int i=len-1;i>=0;i–)for(int j=i+1;j<len;j++) {dp[i][j]=dp[i+1][j];for(int k=i+1;k<=j;k++)if(a[i]=='('&&a[k]==')'||a[i]=='['&&a[k]==']')dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k][j]+2); } printf("%d\n",dp[0][len-1]);}return 0;}
,天不负;卧薪尝胆,三千越甲可吞吴。