【bzoj4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+背包dp
题目描述
给出 $n$ 个括号序列,从中选出任意个并将它们按照任意顺序连接起来,求以这种方式得到匹配括号序列的最大长度。
输入
输出
样例输入
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的更多相关文章
- 【bzoj5072】[Lydsy十月月赛]小A的树 树形背包dp
题解: 比较好想 首先注意到如果最暴力的做法复杂度无法接受 而5000的范围基本是n^2做法了 只使用已经遍历过的点数目和当前子树中的点数目转移我们知道复杂度是n^2的 于是大胆猜测一波同一个节点为根 ...
- 【BZOJ4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+动态规划
[BZOJ4922][Lydsy六月月赛]Karp-de-Chant Number Description 卡常数被称为计算机算法竞赛之中最神奇的一类数字,主要特点集中于令人捉摸不透,有时候会让水平很 ...
- 【BZOJ4919】[Lydsy六月月赛]大根堆 线段树合并
[BZOJ4919][Lydsy六月月赛]大根堆 Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切 ...
- [BZOJ4920][Lydsy六月月赛]薄饼切割
[BZOJ4920][Lydsy六月月赛]薄饼切割 试题描述 有一天,tangjz 送给了 quailty 一张薄饼,tangjz 将它放在了水平桌面上,从上面看下去,薄饼形成了一个 \(H \tim ...
- bzoj 4921: [Lydsy六月月赛]互质序列
4921: [Lydsy六月月赛]互质序列 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 188 Solved: 110[Submit][Status ...
- bzoj4922 [Lydsy1706月赛]Karp-de-Chant Number 贪心+背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4922 题解 记录每一个串的没有匹配的右括号 \()\) 的数量为 \(a_i\),为匹配的左括 ...
- bzoj 4919: [Lydsy六月月赛]大根堆
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
- 【BZOJ4919】[Lydsy六月月赛]大根堆
题解: 我觉得数据结构写成结构体还是有必要的 因为不然一道题里出现了两个相同的数据结构由于名字很像很容易出错 另外初始化用segmenttree(){ } 首先裸的dp很好想 f[i][j]表示在i点 ...
- 【bzoj4921】[Lydsy六月月赛]互质序列 暴力
题目描述 给出一个序列,要求删除一段非空区间,使得剩下的数的个数大于等于2.求所有删除方式剩下的数的最大公约数的和. 输入 第一行包含一个正整数n(3<=n<=100000),表示序列的长 ...
随机推荐
- 北京Uber优步司机奖励政策(2月26日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 成都Uber优步司机奖励政策(2月16日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- vue中开发webSocket
先安装 sockjs-client 和 stompjs npm install sockjs-client npm install stompjs <template> <div&g ...
- WeTest功能优化第2期:云真机智能投屏,调试告别鼠标
第2期功能优化目录 [云真机视频映射]云真机画面本地映射[兼容性测试报告]新增问题机型聚类功能[新增Android9.0]同步上线最新安卓系统 本期介绍的云测产品功能优化,既有重磅级技术突破,也有报告 ...
- Ajax中post请求和get请求的区别
首先提出两点Post比Get大的不同地方 1.post请求浏览器每次不会缓存,每次都会重新请求,而get请求不要缓存的时候,需要手动设置 写上xhr.setRequestHeader("If ...
- hdu1455Sticks(经典dfs+剪枝)
Sticks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- Qt-QML-QML调用C++类
QML用来做界面,在不考虑数据的请款下,那是溜溜的,但是,程序是没有不和后台数据交互的,但是了,QML在数据处理方面的效率又是不敢恭维的,这里就出现了QML负责前端界面,而后端使用JS或者C++了. ...
- SSH:远程登陆
SSH用于计算机之间的加密登录的前提是公钥为真,所以存在中间人攻击中间人攻击:与https协议不同,SSH协议的公钥是没有CA公证的,当对公钥的请求被中间截获时,中间人可以发出伪造公钥干坏事而不被识破 ...
- Java实验二实验报告:java面向对象程序设计
java实验二实验报告 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计模式 实验 ...
- 20172314 Android程序设计 实验四
课程:<程序设计与数据结构> 班级: 1723 姓名: 方艺雯 学号:20172314 实验教师:王志强 实验日期:2018年5月30日 必修/选修: 必修 1.实验内容及要求 (1)An ...