zoukankan      html  css  js  c++  java
  • poj 2955 Brackets(区间dp)

    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 i1i2, …, im where 1 ≤ i1 < i2 < … < im ≤ nai1ai2 … 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

     
    题意:选出最多的括号匹配数
     
          区间dp
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<vector>
     5 #include<set>
     6 #include<algorithm>
     7 #include<cmath>
     8 #include<stdlib.h>
     9 #include<map>
    10 using namespace std;
    11 #define N 106
    12 #define inf 1<<26
    13 int n;
    14 char s[N];
    15 int dp[N][N];
    16 bool check(int x,int y)
    17 {
    18     if(s[x]=='(' && s[y]==')')
    19       return true;
    20      if(s[x]=='[' && s[y]==']')
    21        return true;
    22      return false;
    23 }
    24 int main()
    25 {
    26     while(scanf("%s",s) && s[0]!='e')
    27     {
    28         n=strlen(s);
    29         //for(int i=1;i<=n;i++)
    30           // printf("---%c",s[i]);
    31         
    32         memset(dp,0,sizeof(dp));
    33         for(int i=0;i<n;i++)
    34           {
    35               if(check(i,i+1))
    36                 dp[i][i+1]=2;
    37           }
    38         for(int len=1;len<n;len++)
    39         {
    40             for(int i=0;i+len<n;i++)
    41             {
    42                 int j=i+len;
    43                 if(check(i,j))
    44                   dp[i][j]=dp[i+1][j-1]+2;
    45                   for(int k=i;k<=j;k++)
    46                   {
    47                       dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
    48                   }
    49             }
    50         }
    51         printf("%d
    ",dp[0][n-1]);
    52         
    53     }
    54     return 0;
    55 }
    View Code
  • 相关阅读:
    ExtJS4 动态生成grid出口excel(纯粹的接待)
    oracle10g获得Date类型字段无分,秒的解决方案!
    ubuntu13.10 下一个 g++和gcc 4.8不兼容的问题不能被安装
    简单的导航
    Duanxx的C++学习 : 数字转换String
    图widget--jqplot样品和参数描述的简单演示
    m_Orchestrate learning system---三十、项目中的dist文件一般是做什么的
    开放windows服务器端口-----以打开端口8080为例
    phpstudy一个域名配置两个网站(一个是thinkphp5,一个是原生php)
    双向绑定的具体应用场景有哪些
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/4731375.html
Copyright © 2011-2022 走看看