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

    Brackets
    My Tags (Edit)
    Source : Stanford ACM Programming Contest 2004
    Time limit : 1 sec Memory limit : 32 M
    Submitted : 188, Accepted : 113
    5.1 Description
    We give the following inductive definition of a “regular brackets” sequence:
    • the empty sequence is a regular brackets sequence,
    • if s is a regularbrackets 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 i1,i2,…,im where 1 ≤ i1 < i2 < …< im ≤ n, ai1ai2 …aim is a regular brackets sequence.
    5.2 Example
    Given the initial sequence ([([]])], the longest regular brackets subsequence is [([])].
    5.3 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. For example:
    ((()))
    ()()()
    ([]])
    )[)(
    ([][][)
    end
    5.4 Output
    For each input case, the program should print the length of the longest possible regular brackets subsequence on a single line. For example:
    6
    6
    4
    0
    6

    一道简单的区间DP题目

    关于区间DP,可以参照这个博客
    http://blog.csdn.net/dacc123/article/details/50885903

    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <algorithm>
    
    using namespace std;
    char a[105];
    int dp[105][105];
    int main()
    {
        while(scanf("%s",a+1)!=EOF)
        {
            if(a[1]=='e')
                break;
            memset(dp,0,sizeof(dp));
            int n=strlen(a+1);
            for(int len=1;len<n;len++)
            {
                for(int i=1;i+len<=n;i++)
                {
                    int j=i+len;
                    if((a[i]=='('&&a[j]==')')||(a[i]=='['&&a[j]==']'))
                        dp[i][j]=dp[i+1][j-1]+2;
                    else
                        dp[i][j]=dp[i+1][j-1];
                    for(int k=i;k<j;k++)
                    {
                        if(dp[i][j]<dp[i][k]+dp[k+1][j])
                            dp[i][j]=dp[i][k]+dp[k+1][j];
                    }
                }
            }
            printf("%d
    ",dp[1][n]);
        }
        return 0;
    }
  • 相关阅读:
    js 手机端触发事事件、javascript手机端/移动端触发事件
    行高引起的行内块级元素间距
    js实现复制功能
    encodeURI、encodeURIComponent、decodeURI、decodeURIComponent的区别
    CSS动画总结效果
    CSS属性之word-break:break-all强制性换行
    在handlebars.js {{#if}}条件下的逻辑运算符解决方案
    js模版引擎handlebars.js实用教程——由于if功力不足引出的Helper
    垂直方向兼容显示的内容多少的情况样式Flex布局
    实现div里的img图片水平垂直居中
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228770.html
Copyright © 2011-2022 走看看