• POJ 2955


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

    Time Limit: 1000MS Memory Limit: 65536K

    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,设dp[i][j]为str[i~j]范围内的答案,即dp[0][len-1]即问题所求答案;

    假设我们在求dp[i][j]时,已经知道所有dp[ii][jj](i<ii<jj<j),那么,做一下两项操作即可:

    ①先OB一下str[i]和str[j]是不是匹配的,如果是的话,尝试更新dp[i][j]:dp[i][j] = max( dp[i][j] , dp[i+1][j-1]+2 )

    ②为了保证dp[i][j]的正确性,枚举k=i~j,尝试更新dp[i][j]:dp[i][j] = max( dp[i][j] , dp[i][k]+dp[k][j] )

    完美~

    AC代码:

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    char str[105];
    int dp[105][105];
    bool check(char a,char b)
    {
        if( (a=='('&&b==')') || (a=='['&&b==']') ) return 1;
        else return 0;
    }
    int main()
    {
        while(scanf("%s",str))
        {
            if(str[0]=='e') break;
    
            int len=strlen(str);
            memset(dp,0,sizeof(dp));
            for(int l=2;l<=len;l++)
            {
                for(int i=0,j=i+l-1;j<len;i++,j=i+l-1)
                {
                    if(check(str[i],str[j])) dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2);
    
                    for(int k=i;k<=j;k++) dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]);
                }
            }
            printf("%d
    ",dp[0][len-1]);
        }
    }
  • 相关阅读:
    运算符的优先级
    % 取余运算 取模运算
    Java运算符,关系运算符
    自增自减 a++,++a,a--,--a
    Java运算符,算术运算符
    启用div作为编辑器 添加contentEditalbe = “true”,如何让在Html中特殊字符不被转义
    一个合格前端必看的书籍
    JQuery中eq()和get()的区别
    div,contenteditable编辑器之ctrl+enter换行,enter发送
    Angularjs 源码
  • 原文地址:https://www.cnblogs.com/dilthey/p/7875215.html
Copyright © 2020-2023  润新知