POJ 2955 区间DP必看的括号匹配问题,经典例题

Brackets
Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 14226 Accepted: 7476
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

#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
bool match(char a,char b);
#define mst(a,b) memset((a),(b),sizeof(a))
const int maxn=500;
int dp[maxn][maxn];
int  main()
{
        string ob;
        while(cin>>ob)
        {
            if(ob=="end") break;
            mst(dp,0);
            for(int len=2;len<=ob.length( );len++){
                for(int i=1;i<=ob.length( )+1-len;i++){
                    int j=len+i-1;
                    if(match(ob[i-1],ob[j-1])) dp[i][j]=dp[i+1][j-1]+2;
                    for(int k=i;k<j;k++)
                    {
                            dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
                    }
                }
            }
          //  for(int len=1;len<ob.length( )-2;len++) cout<<dp[len][len+3]<<' ';
            cout<<dp[1][ob.length( )]<<endl;
        }
}
bool match(char a,char b)
{
    if(a=='('&&b==')') return 1;
    if(a=='['&&b==']') return 1;
    else return 0;
}
posted @ 2019-04-16 14:33  风骨散人  阅读(89)  评论(0编辑  收藏  举报