zoukankan      html  css  js  c++  java
  • 某DP题目1

      题意:

        有n个由左右括号组成的字符串,选择其中若干字符串,使得组成的括号序列合法且长度最长。n <= 1000,n个字符串的长度和 <= 10000。

      分析:

        其实我一开始做这一题的时候,看错了字符串长度和,以为每个字符串的长度都是10000,。

        首先我们具体分析每一个字符串,可以发现去掉合法的字符串之后,剩下的只有一堆右括号加上一堆左括号,也就是说整理之后,每个字符串就只剩下了两个参数,分别是左、右括号的个数。

        这个东西看起来像是一个背包的东西,由于要求组成的括号序列合法,即左右括号数量相等。那么是不是可以直接做差来一个背包呢?我们会发现,是不可以的。因为你并不知道会不会出现逆序括号合法化的情况,即")))((("视为合法化。

        这时候,就需要分类dp。我们把左括号数大于右括号数的括号序列统计出来。设F1[i]表示左括号数-右括号数 = i时组成的括号序列的最大长度。

        设当前做到第j个括号序列,设它的左括号数为x[j]、右括号数为y[j]。则转移方程:F1[i] = max{F1[i-(x[j]-y[j])]+len[j]},且必须满足y[j] <= i-(x[j]-y[j])(因为你不能减到负的嘛,如果是负的就要转到第二种情况去讨论了)。由于必须满足如上条件,且右括号越小,转移的可行性就越高,因此,我们需要把统计出的括号序列按右括号的大小从小到大排序,因为这样排序才能使转移可行(前提有了左括号数都是大于右括号数的)。

        如此我们求得了F1,我们再把右括号数大于左括号数的括号序列统计出来,再定义F2[i]为右括号数-左括号数 = i时组成括号序列的最大长度。

        那么ans = max{F1[i]+F2[i]};

        当然,是不会出现方案重叠的情况,因为做DP的时候已经分类了。

  • 相关阅读:
    练习
    js简介、基本语法、类型转换、变量、运算符、分支语句、循环语句、函数、函数调用
    样式表、格式布局、流式布局
    表单
    图片热点、网页划区
    JS模拟窗口
    JavaScript 常用功能实现一览(一)
    分页打印控制 摘自于网络:http://www.cnblogs.com/joinger/articles/1807517.html
    我眼中的C#3.0 摘自于网络:http://www.cnblogs.com/joinger/articles/1297237.html
    .net ToString()用法详解与格式说明
  • 原文地址:https://www.cnblogs.com/-ZZB-/p/6421663.html
Copyright © 2011-2022 走看看