• Brackets(区间dp)


    Brackets
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 3624   Accepted: 1879

    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, …, imwhere 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

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 using namespace std;
     5 char st[150] ;
     6 int a[110][110] ;
     7 
     8 bool check (int a , int b)
     9 {
    10     if (st[a] == '(' && st[b] == ')' )
    11         return 1 ;
    12     if (st[a] == '[' && st[b] == ']' )
    13         return 1 ;
    14     return 0 ;
    15 }
    16 
    17 int main ()
    18 {
    19    // freopen ("a.txt" , "r" , stdin ) ;
    20     while (1) {
    21         gets (st) ;
    22         if (strcmp (st , "end") == 0)
    23             break ;
    24         memset (a , 0 , sizeof(a) ) ;
    25         int len = strlen (st) ;
    26         for (int o = 2 ; o <= len ; o++) {
    27             for (int i = 0 ;  i < len - o + 1; i++) {
    28                 int j = i + o ;
    29                 for (int k = i ; k < j ; k++ ) {
    30                     a[i][j - 1] = max (a[i][j - 1] , a[i][k] + a[k + 1][j - 1] ) ;
    31                     if (check (i , j - 1) ) {
    32                         a[i][j - 1] = max (a[i][j - 1] , a[i + 1][j - 1 - 1] + 2 ) ;
    33                     }
    34                 }
    35             }
    36         }
    37         printf ("%d
    " , a[0][len - 1] ) ;
    38     }
    39     return 0 ;
    40 }
    View Code

    区间dp感觉和merge sort有异曲同工之妙
    从可行的最小区间出发,逐级上去,最终得到整段区间的最终结。

    dp[i][j] 指[i , j]这段区间的最优解

  • 相关阅读:
    declare handler 声明异常处理的语法
    mysql存储过程获取sqlstate message_text
    mongoTemplate操作内嵌文档
    mysql索引之七:组合索引中选择合适的索引列顺序
    mongoDB的操作总结
    explain之三:MYSQL EXPLAIN语句的extended 选项学习体会,分析诊断工具之二
    状态模式
    代码重构----使用java有限状态机来消除太多的if else判断
    断路器(CircuitBreaker)设计模式
    断路器之一:Hystrix 使用与分析
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4348638.html
Copyright © 2020-2023  润新知