zoukankan      html  css  js  c++  java
  • POJ 2955 Brackets (区间dp 括号匹配)


    Brackets
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 3951   Accepted: 2078

    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

    题目链接:http://poj.org/problem?

    id=2955

    题目大意:给一个括号序列,问序列中合法的括号最多有多少个。若A合法。则[A],(A)均合法,若A,B合法则AB也合法

    题目分析:和POJ 1141那道经典括号匹配类似,这题更简单一些。想办法把问题转化,既然要求最大的括号匹配数,我们考虑加最少的括号。使得整个序列合法,这样就转变成1141那题。开下脑动类比二分图最大匹配的性质,最大匹配+最大独立集=点数,显然要增加最少的点使序列合法,则加的最少的点数即为|最大独立集|。我们要求的是原序列的|最大匹配|,以上纯属yy,以下给出转移方程,和1141一模一样
    dp[i][i] = 1;
    然后枚举区间长度
    1)外围匹配:dp[i][j] = dp[i + 1][j - 1];
    2)外围不匹配。枚举切割点:dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]); (i <= k < j)

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int const INF = 0x3fffffff;
    char s[205];
    int dp[205][205];
    
    int main()
    {
        while(scanf("%s", s) != EOF && strcmp(s, "end") != 0)
        {
            int len = strlen(s);
            memset(dp, 0, sizeof(dp));
            for(int i = 0; i < len; i++)
                dp[i][i] = 1;
            for(int l = 1; l < len; l++)
            {
                for(int i = 0; i < len - l; i++)
                {
                    int j = i + l;
                    dp[i][j] = INF;
                    if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))
                        dp[i][j] = dp[i + 1][j - 1];
                    for(int k = i; k < j; k++)
                        dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);
                }
            }
            printf("%d
    ", len - dp[0][len - 1]);
        }
    }
    
    


  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7040016.html
Copyright © 2011-2022 走看看