题目描述

给出 $n$ 个括号序列,从中选出任意个并将它们按照任意顺序连接起来,求以这种方式得到匹配括号序列的最大长度。

输入

第一行包含一个正整数n(1<=n<=300),表示括号序列的个数。
接下来n行,每行一个长度在[1,300]之间的括号序列,仅由小括号构成。

输出

输出一行一个整数,即最大长度,注意你可以一个序列也不选,此时长度为0。

样例输入

3
())
((()
)()

样例输出

10


题解

贪心+背包dp

首先对于一个括号序列,有用的只有:长度、消耗'('的数目、以及'('减去')'的数目。

显然可以dp,但是由于顺序对于本题来说时有用的,因此不能直接dp。

进一步思考可以发现:本题和【bzoj4619】[Wf2016]Swap Space 相同,因此可以按照那道题的贪心策略来决定选择的顺序。

即:先选择'('多于')'的,对于'('多于')'的按照消耗'('的数目从小到大排序,否则按照多出来'('(即'('减去')'的数目+消耗'('的数目)从大到小排序。

确定了顺序后就好办了。设 $f[i][j]$ 表示排序后前 $i$ 个括号序列,多出来'(' 的数目为 $j$ 的最大长度。那么这是一个背包问题。当 $j$ 大于等于消耗 '(' 的数目时能够转移。

最后的答案就是 $f[n][0]$ 。

时间复杂度 $O(n^3)$

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 310
using namespace std;
struct data
{
int x , y , z;
bool operator<(const data &a)const
{
if(y > 0 && a.y <= 0) return 1;
if(y < 0 && a.y >= 0) return 0;
if(y > 0) return x < a.x;
return x + y > a.x + a.y;
}
}a[N];
int f[N][N * N];
char str[N];
int main()
{
int n , m = 0 , i , j;
scanf("%d" , &n);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%s" , str) , a[i].z = strlen(str) , m += a[i].z;
for(j = 0 ; j < a[i].z ; j ++ )
a[i].y += (str[j] == '(' ? 1 : -1) , a[i].x = max(a[i].x , -a[i].y);
}
sort(a + 1 , a + n + 1);
memset(f , 0xc0 , sizeof(f)) , f[0][0] = 0;
for(i = 1 ; i <= n ; i ++ )
{
for(j = 0 ; j <= m ; j ++ ) f[i][j] = f[i - 1][j];
for(j = a[i].x ; j <= m ; j ++ )
if(j + a[i].y >= 0 && j + a[i].y <= m)
f[i][j + a[i].y] = max(f[i][j + a[i].y] , f[i - 1][j] + a[i].z);
}
printf("%d\n" , f[n][0]);
return 0;
}

【bzoj4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+背包dp的更多相关文章

  1. 【bzoj5072】[Lydsy十月月赛]小A的树 树形背包dp

    题解: 比较好想 首先注意到如果最暴力的做法复杂度无法接受 而5000的范围基本是n^2做法了 只使用已经遍历过的点数目和当前子树中的点数目转移我们知道复杂度是n^2的 于是大胆猜测一波同一个节点为根 ...

  2. 【BZOJ4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+动态规划

    [BZOJ4922][Lydsy六月月赛]Karp-de-Chant Number Description 卡常数被称为计算机算法竞赛之中最神奇的一类数字,主要特点集中于令人捉摸不透,有时候会让水平很 ...

  3. 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并

    [BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...

  4. [BZOJ4920][Lydsy六月月赛]薄饼切割

    [BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \tim ...

  5. bzoj 4921: [Lydsy六月月赛]互质序列

    4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 188  Solved: 110[Submit][Status ...

  6. bzoj4922 [Lydsy1706月赛]Karp-de-Chant Number 贪心+背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4922 题解 记录每一个串的没有匹配的右括号 \()\) 的数量为 \(a_i\),为匹配的左括 ...

  7. bzoj 4919: [Lydsy六月月赛]大根堆

    Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...

  8. 【BZOJ4919】[Lydsy六月月赛]大根堆

    题解: 我觉得数据结构写成结构体还是有必要的 因为不然一道题里出现了两个相同的数据结构由于名字很像很容易出错 另外初始化用segmenttree(){ } 首先裸的dp很好想 f[i][j]表示在i点 ...

  9. 【bzoj4921】[Lydsy六月月赛]互质序列 暴力

    题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...

随机推荐

  1. Sublime Text 3 新手上路:必要的安裝、設定與基本使用教學

    http://blog.miniasp.com/post/2014/01/07/Useful-tool-Sublime-Text-3-Quick-Start.aspx

  2. BZOJ3224_普通平衡树_KEY

    题目传送门 平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.平衡二叉树的常用实现方法有红 ...

  3. 全国Uber优步司机奖励政策 (12月28日-1月3日)

    本周已经公开奖励整的城市有:北 京.成 都.重 庆.上 海.深 圳.长 沙.佛 山.广 州.苏 州.杭 州.南 京.宁 波.青 岛.天 津.西 安.武 汉.厦 门,可按CTRL+F,搜城市名快速查找. ...

  4. ORB-SLAM(六)MapPoint与Map

    地图点可以通过关键帧来构造,也可以通过普通帧构造,但是最终,必须是和关键帧对应的,通过普通帧构造的地图点只是临时被Tracking用来追踪用的. 构造函数(地图点3D坐标及其参考帧): // 参考帧是 ...

  5. CLR via c#读书笔记九:接口

    1.接口对一组方法签名进行了统一命名.接口还能定义事件.无参属性和有参属性(C#的索引器). 2.c#禁止接口定义任何一种静态成员. 3.C#编译器要求将实现接口的方法标记为public.CLR要求将 ...

  6. LimitedConcurrencyLevelTaskScheduler

    //-------------------------------------------------------------------------- // // Copyright (c) Mic ...

  7. 下载Web微信视频

    1. 用浏览器(我用Chrome)登录web微信(wx.qq.com) 2. 这个时候如果有人发视频,可以点开播放.用F12打开chrome的调试平台,查看视频源的URL(绿色框的src内容) 3. ...

  8. CodeForces - 1059D(二分+误差)

    链接:CodeForces - 1059D 题意:给出笛卡尔坐标系上 n 个点,求与 x 轴相切且覆盖了所有给出点的圆的最小半径. 题解:二分半径即可.判断:假设当前二分到的半径是 R ,因为要和 x ...

  9. NodeJs学习笔记01-你好Node

    如果你对NodeJs略知一二,不禁会感叹,使用JS的语法和代码习惯就能开发一个网站的后台,实现复杂的数据交互,牛! 对于学习java和php就夹生的小码农来说,简直就是靡靡之音呐~~~ 今晚带着忐忑的 ...

  10. 【Linux 运维】linux系统修改主机名

    主机名的修改:  1.命名解释: [root@localhost~]# 分别代表: 用户名(root) 主机名(localhost) 当前路径(~,当前用户的home目录) 权限标志位(#代表root ...