zoukankan      html  css  js  c++  java
  • POJ2955【区间DP】

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

    题意:[]、()的匹配问题,问一个[]()串中匹配的字符数,匹配方式为[X],(X),X为一个串,问一个长度为N(N<=100)串中最多的匹配字符个数。

    思路:区间DP,dp[l][r]的意思是区间[l,r]的最大匹配数,预处理长度为2的所有区间的最大匹配数,然后由长度为2的区间推出长度为3的所有区间的最大匹配数,由长度为3的区间......在处理区间[l,r]的时候,如果s[l]与s[r]相匹配,那么dp[l][r]=dp[l+1][r-1]+2;然后再没去区间[l,r]的每个断点k,dp[l][r]=max(dp[l][r],dp[l][k],dp[k+1][r]);这一步是必须要执行的。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int MAXN = 150;
    int dp[MAXN][MAXN];
    char s[MAXN];
    int main ()
    {
        while(~scanf("%s", s + 1))
        {
            memset(dp, 0, sizeof(dp));
            if(s[1] == 'e') break;
            int len = strlen(s + 1);
            for(int l = 1; l <= len; l++)
                for(int i = 1; i <= len - l + 1; i++)
                {
                    int j = i + l - 1;
                    if((s[i] == '(' && s[j] == ')') || (s[i] == '[' && s[j] == ']'))
                        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 + 1][j]);
                }
            printf("%d
    ", dp[1][len]);
        }
        return 0;
    }
    想的太多,做的太少。
  • 相关阅读:
    基于jquery 的插件,让IE支持placeholder属性
    MongoDB入门_MongoDB安装与配置
    MongoDB入门_MongoDB特色
    MongoDB入门_相关网站
    MongoDB入门_学习目标
    Shell编程
    redis数据类型及基本命令
    redis配置文件详解
    redis命令
    安装运行redis
  • 原文地址:https://www.cnblogs.com/pealicx/p/6396557.html
Copyright © 2011-2022 走看看