括号序列的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问题模型的更多相关文章

  1. 合法括号序列(dp+组合数学)

    键盘上有左括号(,右括号),和退格键-,共三个键. 牛牛希望按键n次,使得输入的字符串恰好一个合法的括号序列. 每按一次左括号(,字符串末尾追加一个左括号( 每按一次右括号),字符串末尾追加一个右括号 ...

  2. 九度OJ 1337:寻找最长合法括号序列 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:839 解决:179 题目描述: 给你一个长度为N的,由'('和')'组成的括号序列,你能找出这个序列中最长的合法括号子序列么?合法括号序列的 ...

  3. TZOJ 3295 括号序列(区间DP)

    描述 给定一串字符串,只由 “[”.“]” .“(”.“)”四个字符构成.现在让你尽量少的添加括号,得到一个规则的序列. 例如:“()”.“[]”.“(())”.“([])”.“()[]”.“()[( ...

  4. 【区间DP】codevs3657 括号序列题解

    题目描述 Description 我们用以下规则定义一个合法的括号序列: (1)空序列是合法的 (2)假如S是一个合法的序列,则 (S) 和[S]都是合法的 (3)假如A 和 B 都是合法的,那么AB ...

  5. 括号序列模型--序列dp--U86873 小Y的精灵国机房之旅

    括号序列模型及解法 >Codeforces314E◦给定一个长度为n的仅包含左右括号和问号的字符串,将问号变成左括号或右括号使得该括号序列合法,求方案总数.◦例如(())与()()都是合法的括号 ...

  6. [BZOJ 4350]括号序列再战猪猪侠 题解(区间DP)

    [BZOJ 4350]括号序列再战猪猪侠 Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个 ...

  7. Neko and Aki's Prank CodeForces - 1152D (括号序列,dp)

    大意: 将所有长度为2*n的合法括号序列建成一颗trie树, 求trie树上选出一个最大不相交的边集, 输出边集大小. 最大边集数一定不超过奇数层结点数. 这个上界可以通过从底层贪心达到, 所以就转化 ...

  8. BZOJ4350: 括号序列再战猪猪侠【区间DP】

    Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列, ...

  9. 括号序列(区间dp)

    括号序列(区间dp) 输入一个长度不超过100的,由"(",")","[",")"组成的序列,请添加尽量少的括号,得到一 ...

随机推荐

  1. Dijkstra算法——超~~详细!!

    Dijkstra算法_ ** 时隔多月,我又回来了!**_ 今天下午久违的又学了会儿算法,又重新学习了一遍Dijkstra,这是第三次重新学习Dijkstra(*以前学的都忘完了>_<*) ...

  2. 为什么要使用 SPL中的 SplQueue实现队列

    今天看php的SPL标准库部分里面涉及到数据结构其中有 SplQueue 来实现队列效果,但是我刚接触php的时候学习到的是 使用array的 array_push 和 array_pop 就可以实现 ...

  3. 怎样实现跨域AJAX请求发送Cookie

    第一步: 服务器必须在Response Header中设置: Access-Control-Allow-Credentials: true 第二步: 客户端发起请求时需要将 xhr.withCrede ...

  4. instanceof关键字 与 getClass()

    在equals()中使用getClass进行类型判断 我们在覆写equals()方法时,一般都是推荐使用getClass来进行类型判断,不是使用instanceof.我们都清楚instanceof的作 ...

  5. SqlServer2008 R2发布订阅

    网上好多大神写的贴子,自己也看着贴子弄的,写的已经很详细了,我就不重复写了,贴上参考资料: http://www.cnblogs.com/dudu/archive/2010/08/26/1808540 ...

  6. luogu2858奶牛零食题解--区间DP

    题目链接 https://www.luogu.org/problemnew/show/P2858 一句话题意: https://cn.vjudge.net/problem/POJ-3186#autho ...

  7. react 预览pdf 转换

    function getReader(response){ return new Promise(function(resolve,reject){ response.blob().then( blo ...

  8. shiro系列三、ssm框架整合shiro实现权限控制

    shiro权限框架是一个非常优秀的框架,前面的几篇文章对shiro进行了非常详细的介绍和原理分析,那么接下来让我们开始在web项目中使用它(javase也能用shiro): 一.数据库表结构设计 二. ...

  9. 【2017-06-02】Linq高级查询,实现分页组合查询。

    1.以XXX开头 2.以XXX结尾 3.模糊查询 4.求个数 5.求最大值 6.求最小值 7.求平均值 8.求和 9.升序 10.降序 11.分页 Skip()跳过多少条 Take()取多少条 12. ...

  10. 利用 sendBeacon 发送统计信息

    我们经常会在网站追踪用户的信息,比如记录用户的停留时间. window.addEventListener("unload", () => { // sendHTTP }); ...