zoukankan      html  css  js  c++  java
  • 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]);
        }
    }
  • 相关阅读:
    css word-wrap与word-break区别
    input输入框光标位置问题
    正则表达式(二)- 位置匹配攻略
    正则表达式(一)- 字符匹配攻略
    mac电脑重启nginx报错nginx: [error] invalid PID number "" in "/usr/local/var/run/nginx.pid"
    指定js文件不使用 eslint 语法检查
    管理github/gitlab生成多个ssh key
    前端切图两种方法整理
    梳理:移动端Viewport的知识
    切图 — Photoshop(转载)
  • 原文地址:https://www.cnblogs.com/dilthey/p/7875215.html
Copyright © 2011-2022 走看看