码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2955 Brackets (动规)

时间:2014-07-27 23:59:09      阅读:549      评论:0      收藏:0      [点我收藏+]

标签:des   style   http   color   os   strong   io   for   

Brackets
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 2999   Accepted: 1536

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 of s. That is, you wish to find the largest m such that for indices i1, i2, …, im where 1 ≤ i1 < i2 < … < im n, 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

6
6
4
0
6

Source

Stanford Local 2004
?如果找到一对匹配的括号[xxx]oooo,就把区间分成两部分,一部分是xxx,一部分是oooo,然后以此递归直到区间长度为1或者为2
?dp[i][j]表示区间[i,j]之间的最长合法括号子序列长度
?dp[i][j] = min{dp[i+1][j],
dp[i+1][k-1]+dp[k+1][j]+1
 (i<=k<=j&&i和k是一对匹配的括号)
 }
代码:
#include <iostream>
#include <string.h>
#include <math.h>
#include <stdio.h>
using namespace std;
#define M 110
int dp[M][M];
char str[M];
int math(int x,int y)      //判断是否配对。
{
    return str[x]==‘(‘ && str[y]==‘)‘||
           str[x]==‘{‘ && str[y]==‘}‘||
           str[x]==‘[‘ && str[y]==‘]‘;
}
int DFS(int s,int e)
{
    int i,ret,t;
    if(e<s)                return 0;                //对各种特殊情况进行考虑。
    if(e==s)               return dp[s][e]=0;
    if(e-s==1)             return dp[s][e]=math(s,e);      
    if(dp[s][e]!=-1)       return dp[s][e];        //如果这个状态已经计算过。
    ret=DFS(s+1,e);                                //姿势不对,还是看别人的,不懂。
    for(i=s+1;i<=e;i++)                            //找能配对的括号。
        if(math(s,i))
    {
        t=DFS(s+1,i-1)+DFS(i+1,e)+1;
        if(t>ret) ret=t;
    }
    return dp[s][e]=ret;
}
int main()
{
    int i,j,k,n;
    while(scanf("%s",str))
    {
        if(str[0]==‘e‘) break;
        n=strlen(str);
        memset(dp,-1,sizeof(dp));
        DFS(0,n-1);
        printf("%d\n",dp[0][n-1]*2);
    }
    return 0;
}

POJ 2955 Brackets (动规),布布扣,bubuko.com

POJ 2955 Brackets (动规)

标签:des   style   http   color   os   strong   io   for   

原文地址:http://blog.csdn.net/qq2256420822/article/details/38168527

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!