POJ 2955 Brackets

来源:互联网 发布:js包装函数 编辑:程序博客网 时间:2024/06/05 20:06
B - Brackets
Time Limit:1000MS    Memory Limit:65536KB    64bit IO Format:%I64d & %I64u
SubmitStatusPracticePOJ 2955

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 a1a2an, 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 largest m such that for indicesi1, i2, …, im where 1 ≤i1 < i2 < … < imn, ai1ai2aim 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

66406



#include <stdio.h>#include <string.h>#include <algorithm>#define N 105using namespace std;char s[N];int dp[N][N];int l;int isok(char a,char b){        if(a=='(' && b==')')                return 1;        if(a=='[' && b==']')                return 1;        return 0;}int main(){        while(scanf("%s",s)>0&&s[0]!='e')        {                l=strlen(s);                for(int i = 0; i<l; i++)                {                        dp[i][i] = 0;                        if(isok(s[i],s[i+1]))                                dp[i][i+1] = 2;                        else                                dp[i][i+1] = 0;                }                for(int k = 3; k<=l; k++)                {                        for(int i = 0; i+k-1<l; i++)                        {                                dp[i][i+k-1] = 0;                                if(isok(s[i],s[i+k-1]))                                        dp[i][i+k-1] = dp[i+1][i+k-2]+2;                                for(int j = i; j<i+k-1; j++)                                dp[i][i+k-1] = max(dp[i][i+k-1],dp[i][j]+dp[j+1][i+k-1]);                        }                }                printf("%d\n",dp[0][l-1]);        }        return 0;}


0 0