括号序列的dp问题模型
括号序列的dp问题模型
Codeforces314E
◦给定一个长度为n的仅包含左括号和问号的字符串,将问号变成左括号或
右括号使得该括号序列合法,求方案总数。
◦例如(())与()()都是合法的括号序列。
◦ n<=3000。
在括号序列问题中,总是把左括号看作+1,右括号看作-1,要使括号序列合法,只需满足任意一个前缀和大于
或等于0,且总和为0即可
设dp[i][j]表示第i个字符,还剩下j个左括号的方案数
若第i+1个字符是左括号,则dp[i+1][j+1]+=dp[i][j]
若第i+1个字符是右括号,则dp[i+1][j-1]+=dp[i][j]
若第i+1个字符是问号,则dp[i+1][j+1]+=dp[i][j],dp[i+1][j-1]+=dp[i][j]
答案为:dp[n][0]
BZOJ3709
◦在一款电脑游戏中,你需要打败n只怪物(从1到n编号)。为了打败第i只
怪物,你需要消耗d[i]点生命值,但怪物死后会掉落血药,使你恢复a[i]点
生命值。任何时候你的生命值都不能降到0(或0以下)。
◦请问是否存在一种打怪顺序,使得你可以打完这n只怪物而不死掉。
◦N<=10^5
巧妙的贪心题目(之所以引入这道贪心,是因为这道题的解题思路对下一题有帮助)
引入zhhx的一句话:
贪心:noip的贪心很多都是按照某种方式排序,然后依次选或处理。
显然,当a[i]>d[i]时,打第i只怪物会回血,所以先打能回血的怪物
在能回血的怪物里,我们需要先打d[i]小的怪物,故按照d[i]从小到大排序
那么对于不能回血的怪物,我们该怎样排序呢?
首先,如果我们最后能活下来,那么剩余的生命值一定是固定的,所以反着来考虑,和正着是一样的
反着来想我们需要先打a[i]小的怪物,正着来想就是按照a[i]从大到小排序
因此我们把这些怪物分成两组,a[i]-d[i]>0的为一组,a[i]-d[i]<0的为一组
再分别按照d[i]从小到大,a[i]从大到小进行排序
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define Maxn 100100
#define ll long long
int n;
ll z;
struct node{
int dec,inc,num;
}a[Maxn],b[Maxn];
bool cmp1(node x,node y)
{
return x.dec<y.dec;
}
bool cmp2(node x,node y)
{
return x.inc>y.inc;
}
int ans[Maxn];
int tot1=0,tot2=0;
int main()
{
scanf("%d%lld",&n,&z);
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
if(y-x>=0)//
{
a[++tot1].dec=x;a[tot1].inc=y;a[tot1].num=i;
}
else
{
b[++tot2].dec=x;b[tot2].inc=y;b[tot2].num=i;
}
}
sort(a+1,a+tot1+1,cmp1);
sort(b+1,b+tot2+1,cmp2);
for(int i=1;i<=tot1;i++)
{
z-=a[i].dec;
if(z<=0){printf("NIE");return 0;}
z+=a[i].inc;
}
for(int i=1;i<=tot2;i++)
{
z-=b[i].dec;
if(z<=0){printf("NIE");return 0;}
z+=b[i].inc;
}
printf("TAK\n");
for(int i=1;i<=tot1;i++)printf("%d ",a[i].num);
for(int i=1;i<=tot2;i++)printf("%d ",b[i].num);
return 0;
}
括号序列的dp问题模型的更多相关文章
- 合法括号序列(dp+组合数学)
键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字符串恰好一个合法的括号序列. 每按一次左括号(,字符串末尾追加一个左括号( 每按一次右括号),字符串末尾追加一个右括号 ...
- 九度OJ 1337:寻找最长合法括号序列 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...
- TZOJ 3295 括号序列(区间DP)
描述 给定一串字符串,只由 “[”.“]” .“(”.“)”四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:“()”.“[]”.“(())”.“([])”.“()[]”.“()[( ...
- 【区间DP】codevs3657 括号序列题解
题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...
- 括号序列模型--序列dp--U86873 小Y的精灵国机房之旅
括号序列模型及解法 >Codeforces314E◦给定一个长度为n的仅包含左右括号和问号的字符串,将问号变成左括号或右括号使得该括号序列合法,求方案总数.◦例如(())与()()都是合法的括号 ...
- [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)
[BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...
- Neko and Aki's Prank CodeForces - 1152D (括号序列,dp)
大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化 ...
- BZOJ4350: 括号序列再战猪猪侠【区间DP】
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列, ...
- 括号序列(区间dp)
括号序列(区间dp) 输入一个长度不超过100的,由"(",")","[",")"组成的序列,请添加尽量少的括号,得到一 ...
随机推荐
- WPF入门(2)——数据绑定与INotifyPropertyChanged(INPC)
接上篇,我们在MainViewModel类中创建个属性: public string Name { get; set; } 然后去UI的xaml文件中binding一下: 此时运行程序是不会得到我们想 ...
- HeidiSQL 导入Excel数据
一 前言 原文出处:http://blog.csdn.net/qq_27727681/article/details/53944744 二 效果演示: 2000多条数据,顺利导入成功. 三 实现方法 ...
- 作业13:Map相关知识点(一)
一 Map相关类图 二 Map接口 1 Map接口中的方法 jdk 方法名 简单描述 put(K,V):V 添加value,当Key对应无值,返回null;有值则返回上一个值.(覆盖式,可以反复覆盖前 ...
- 钉钉微应用内置浏览器js缓存清理
html中引用的js文件加上版本号,如下: <script type="text/javascript" src="js/xxx.js?version=1.0.1& ...
- HTML练习一
效果图 动态图 html代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- OPENGL 显示BMP图片+旋转
VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...
- Ubuntu + Django(DRF) + channels(websocket)+NGINX + uwsgi 环境部署
原来uwsgi并不能启动 asgi 呀!现在才知道,就因为这一点我花了一周时间才成功啊!!!!!!!! 是呀!你启动uwsgi 是将你的项目启动了,可是你也发现虽然启动了,但是你的websocke ...
- 如何使用Marketing Cloud的扩展字段作为搜索条件进行搜索
需求:我在Marketing Cloud的contact模型上用custom field这个应用创建了一个Extension field,名称为微信ID. 现在客户的需求是使用这个字段作为过滤条件进行 ...
- JTree实现QQ好友列表
最近学习了一下JTree的使用方法: 先来看一下树的实例: 构建一个树, DefaultMutableTreeNode root = new DefaultMutableTreeNode(" ...
- jumpserver跳板机docker安装小小趟坑
最近日常运维的时候发现每次登陆服务器都要打开终端目录连接对应的服务器,闲暇的时候还好,运维任务很重的时候才发现这样的玩法很傻,浪费时间且一点儿都跟不上潮流,然后打开githup开始搞起来.docker ...