zoukankan      html  css  js  c++  java
  • POJ 2955 Brackets (区间DP)

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

    Brackets
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 1977   Accepted: 1012

    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的思想了。
    我的代码是采用记忆化搜索写出来的。
     
    状态转移方程dp[i][j]=max(dp[i+1][j],2+dp[i+1][k-1]+dp[k+1][j])       i和j是一对括号 && i<k<=j
    其实就是看第i个括号的情况。
    舍弃第i个括号,就是dp[i+1][j],或者是往后找和i匹配的,然后就分成了两部分了。
    //============================================================================
    // Name        : POJ.cpp
    // Author      : 
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    const int MAXN=110;
    char str[MAXN];
    int dp[MAXN][MAXN];
    int solve(int i,int j)
    {
        if(dp[i][j]!=-1)return dp[i][j];
        if(j<=i)return dp[i][j]=0;
        else if(j==i+1)
        {
            if( (str[i]=='('&&str[j]==')')||(str[i]=='['&&str[j]==']') )return dp[i][j]=2;
            else return dp[i][j]=0;
        }
        dp[i][j]=solve(i+1,j);
        for(int k=i+1;k<=j;k++)
            if( (str[i]=='('&&str[k]==')')||(str[i]=='['&&str[k]==']') )
                dp[i][j]=max(dp[i][j],2+solve(i+1,k-1)+solve(k+1,j));
        return dp[i][j];
    }
    
    int main()
    {
    //    freopen("in.txt","r",stdin);
    //    freopen("out.txt","w",stdout);
        while(scanf("%s",str)==1)
        {
            if(strcmp(str,"end")==0)break;
            memset(dp,-1,sizeof(dp));
            int n=strlen(str);
            printf("%d\n",solve(0,n-1));
        }
        return 0;
    }
     
     
     
     
     
    人一我百!人十我万!永不放弃~~~怀着自信的心,去追逐梦想
  • 相关阅读:
    BSGS
    [AT1252] IOIOI カード占い
    [十二省联考2019]春节十二响
    [CF912E] Prime Gift
    CDQ分治
    [CF747F] Igor and Interesting Numbers
    [十二省联考2019]异或粽子
    51Nod 2128 前缀异或
    51Nod 3212 数字变位
    HDU 1106 排序
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3051402.html
Copyright © 2011-2022 走看看