zoukankan      html  css  js  c++  java
  • 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]这段区间的最优解

  • 相关阅读:
    暂停公告
    【laravel】Laravel 5 TokenMismatchException on PHP 5.6.9
    【laravel】laravel class 里面定义以head开头的方法会报错
    【kindle】【转发】kindle链接WIFI自动断开问题
    【js】window.onscroll 无效问题
    【js】【转发】jreturn;、return true、return false;区别
    【js】【vue】获取当前dom层
    【js】input 焦点到内容的最后
    【jquery】 选中复选框 和 return false 的影响
    【jquery】 form ajaxSubmit 问题
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4348638.html
Copyright © 2011-2022 走看看