POJ

来源:互联网 发布:编译php strip tags 编辑:程序博客网 时间:2024/06/11 17:32

Brackets

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8536 Accepted: 4553

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

Stanford Local 2004

题意:

给定一个括号序列,让你求左右匹配的最长括号子序列
可以想到,对于一个区间L,R括号的组合形式必然为(……)(……)或者(),[]同理,那么我们枚举中间断开的k点,DP[L][R]=max{DP[L][K]+DP[K+1][R]},L<=K

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=100+5;char s[maxn];int dp[maxn][maxn];int main(){  while(~scanf("%s",s+1))  {    if(s[1]=='e')break;    int n=strlen(s+1);    memset(dp,0,sizeof(dp));    for(int l=1;l<=n;++l)    {      for(int i=1;i+l-1<=n;++i)      {        int L=i,R=i+l-1;        if((s[L]=='('&&s[R]==')')||(s[L]=='['&&s[R]==']'))          dp[L][R]=dp[L+1][R-1]+2;        for(int k=L;k<R;++k)          dp[L][R]=max(dp[L][R],dp[L][k]+dp[k+1][R]);      }    }    printf("%d\n",dp[1][n]);  }  return 0;}