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;
    }
     
     
     
     
     
    人一我百!人十我万!永不放弃~~~怀着自信的心,去追逐梦想
  • 相关阅读:
    Java Swing打猎射击游戏源码
    php实现在线下载程序安装包功能
    WP
    双人对战的球类游戏IOS源码
    非常不错的新闻客户端应用安卓源码
    创业建议:如何写挖人邮件
    wp8路线跟踪应用源码详细说明
    wp版笔记本应用源码
    旅游风景展示应用源码iPad版
    bitset优化背包
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3051402.html
Copyright © 2011-2022 走看看