zoukankan      html  css  js  c++  java
  • Brackets_区间DP

    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 6217   Accepted: 3331

    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

    定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目

    那么 假如第 i 个和第 j 个是一对匹配的括号那么dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ;

    那么我们只需要从小到大枚举所有 i 和 j 中间的括号数目,然后满足匹配就用上面式子dp,然后每次更新dp [ i ] [ j ]为最大值即可。

    更新最大值的方法是枚举 i 和 j 的中间值,然后让 dp[ i ] [ j ] = max ( dp [ i ] [ j ] , dp [ i ] [ f ] + dp [ f+1 ] [ j ] ) ;

    #include<iostream>
    #include<stdio.h>
    #include<string>
    #include<string.h>
    using namespace std;
    const int N=120;
    int dp[N][N];
    int main()
    {
        string s;
        while(cin>>s)
        {
            if(s=="end") break;
            memset(dp,0,sizeof(dp));
            for(int i=1;i<s.size();i++)
            {
    
                for(int j=0,k=i;k<s.size();j++,k++)
                {
                    if(s[j]=='('&&s[k]==')'||s[j]=='['&&s[k]==']')
                        dp[j][k]=dp[j+1][k-1]+2;
                    for(int f=j;f<k;f++)
                        dp[j][k]=max(dp[j][k],dp[j][f]+dp[f+1][k]);
                }
            }
            cout<<dp[0][s.size()-1]<<endl;
        }
        return 0;
    }
  • 相关阅读:
    openwrt 相关文章
    负载均衡相关文章
    Today's Progress
    Rodrigues formula is beautiful, but uneven to sine and cosine. (zz Berkeley's Page)
    Camera Calibration in detail
    Fundamental Matrix in Epipolar
    Camera Calibration's fx and fy do Cares in SLAM
    FilterEngine::apply
    FilterEngine 类解析——OpenCV图像滤波核心引擎(zz)
    gaussBlur
  • 原文地址:https://www.cnblogs.com/iwantstrong/p/5746293.html
Copyright © 2011-2022 走看看