【题解】洛谷P1941 [NOIP2014TG] 飞扬的小鸟(背包DP)
次元传送门:洛谷P1941
思路
从题意可知 在每个单位时间内 可以无限地向上飞 但是只能向下掉一次
所以我们可以考虑运用背包解决这道题
上升时 用完全背包
下降时 用01背包
设f[x][y]为在坐标(x,y)时的最小点击屏幕次数
当飞到天花板时和撞到柱子时特判
一开始设ans为极大值
如果最后一排的值都为极大值则无解
如果无解就倒着回来判断最远能到达第几根柱子
代码
#include<iostream>
#include<cstring>
using namespace std;
#define maxn 10010
int up[maxn],down[maxn],low[maxn],high[maxn];
int f[maxn][];
bool vis[maxn];
int n,m,k,cnt,ans;
int main()
{
memset(f,0x3f,sizeof(f));//初始化为极大值
cin>>n>>m>>k;
for(int i=;i<=n;i++) cin>>up[i]>>down[i];
for(int i=;i<=n;i++)//初始化柱子
{
low[i]=;
high[i]=m;
}
for(int i=;i<=k;i++)
{
int x,y,z;
cin>>x>>y>>z;
vis[x]=;
low[x]=y+;
high[x]=z-;
}
for(int i=;i<=m;i++) f[][i]=;//第一排全是0
for(int i=;i<=n;i++)//枚举x坐标
{
for(int j=+up[i];j<=m+up[i];j++)//完全背包 当前点可以由前一个点上升一次而来
f[i][j]=min(f[i-][j-up[i]]+,f[i][j-up[i]]+);//也可以由当前点上升一次而来
for(int j=m+;j<=m+up[i];j++)//天花板特判
f[i][m]=min(f[i][m],f[i][j]);
for(int j=;j<=m-down[i];j++)//01背包 当前点由前一个点掉下来
f[i][j]=min(f[i][j],f[i-][j+down[i]]);
for(int j=;j<low[i];j++)//判断柱子
f[i][j]=f[][]; //赋值为极大值
for(int j=high[i]+;j<=m;j++)
f[i][j]=f[][];
}
ans=f[][];//赋值为极大值
for(int i=;i<=m;i++) ans=min(ans,f[n][i]);//查询ans
if(ans<f[][])
cout<<<<endl<<ans;//如果有ans
else//如果无解
{
int now,j;
for(now=n;now>=;now--)//倒着判断
{
for(j=;j<=m;j++)//如果当前排可以到达就退出
if(f[now][j]<f[][]) break;
if(j<m) break;
}
ans=;
for(int i=;i<=now;i++)
if(vis[i]) ans++;//计算可以到达的x坐标中有几个管子
cout<<<<endl<<ans;
}
}
【题解】洛谷P1941 [NOIP2014TG] 飞扬的小鸟(背包DP)的更多相关文章
- 【洛谷P1941】飞扬的小鸟
f [ i ] [ j ] 表示横坐标为 i ,高度为 j 时的最小点击次数 分别dp处理: 1.上升,(1)<m (2)>=m 2.下降 3.管道 #include<cstdio& ...
- UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP
#17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:// ...
- 洛谷P1941 飞扬的小鸟(背包 dp)
题意 题目链接 Sol 很显然的dp,设\(f[i][j]\)表示第\(i\)个位置,高度为\(j\)的最小步数 向上转移的时候是完全背包 向下转移判断一下就可以 #include<bits/s ...
- 【洛谷P1417】烹调方案 贪心+背包dp
题目大意:一共有 n 件食材,每件食材有三个属性,ai,bi和ci,如果在t时刻完成第i样食材则得到ai-t*bi的美味指数,用第i件食材做饭要花去ci的时间.众所周知,gw的厨艺不怎么样,所以他需要 ...
- 洛谷P1273 有线电视网 树上分组背包DP
P1273 有线电视网 )逼着自己写DP 题意:在一棵树上选出最多的叶子节点,使得叶子节点的值 减去 各个叶子节点到根节点的消耗 >= 0: 思路: 树上分组背包DP,设dp[u][k] 表示 ...
- [洛谷P4141] 消失之物「背包DP」
暴力:暴力枚举少了哪个,下面套一个01背包 f[i][j]表示到了i物品,用了j容量的背包时的方案数,f[i][j]=f[i-1][j]+f[i-1][j-w[i]]O(n^3) 优化:不考虑消失的, ...
- [洛谷P1941] 飞扬的小鸟
洛谷题目链接:飞扬的小鸟 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了 ...
- 洛谷 P1941 飞扬的小鸟
洛谷 P1941 飞扬的小鸟 原题链接 首先吐槽几句 noip都快到了,我还不刷起联赛大水题! 题目描述 Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节 ...
- 洛谷 P2015 二叉苹果树 (树上背包)
洛谷 P2015 二叉苹果树 (树上背包) 一道树形DP,本来因为是二叉,其实不需要用树上背包来干(其实即使是多叉也可以多叉转二叉),但是最近都刷树上背包的题,所以用了树上背包. 首先,定义状态\(d ...
随机推荐
- JSON 转 VO
需求 将获取的json数据直接转为vo 解决 利用net.sf.json.JSONObject的toBean() 确保json中的key值和vo中的字段名称一致 JSONObject jsonObje ...
- Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)
一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...
- 【转】JSON.parse()与JSON.stringify()的区别
JSON.parse()[从一个字符串中解析出json对象] 例子: //定义一个字符串 var data='{"name":"goatling"}' //解析 ...
- ES6中的import()函数
import(specifier) 上面代码中,import函数的参数specifier,指定所要加载的模块的位置.import命令能够接受什么参数,import()函数就能接受什么参数,两者区别主要 ...
- 初识 ElasticSearch
场景:最近有同事分享了ElasticSearch Inverted Index,所以自己也了解一下基于Lucene的ES. 转载自:http://www.jianshu.com/p/05cff7175 ...
- C++类继承--基类析构函数加上Virtual
下面的内容要说明两个问题:1. 基类的析构函数为什么要加上Virtual--防止内存泄露 1. 基类虚构函数无virtual,派生类无法析构,会导致内存泄露 #include <stdio.h& ...
- eclipse安装checkStyle
今天用eclipse mars 安装checkstyle 代码测试工具,安装完后重启竟然没有,最后发现原来是 自己安装的步骤错了,记录下. 1. 我的版本是:Version: Mars.2 Relea ...
- named 快速部署及主机记录普及
实验环境centos7.2,仅供参考 yum -y install epel-release --安装最新yum配置源 cd /etc/yum.repos.d/ # wget http://re ...
- C#启动服务
启动服务的方法有很多种,简单的cmd下dos命名,手动启动,还有C#代码启动. 我们要实现的功能: 判断是否安装 是否启动 启动服务 关闭服务 我封装了有关服务的代码,如下: using System ...
- QTimer掉坑出坑过程
最近遇到一个问题,就是关于QTimer设置了10ms,结果不生效,很头疼啊,查了快一天了,终于知道为什么了? 先说下QTimer的使用方法: m_delayHideTimer这是QTimer的对象. ...