飞扬的小鸟 DP

细节有点恶心的DP,设\(f[i][j]\)表示横坐标为\(i\)(从\(0\)开始)高度为\(j\)时,屏幕点击的最小次数为\(f[i][j]\),转移便很好写了,这里要注意枚举当前状态时要枚举完所有\(j\),因为每次转移只向上跳了一次,所以必须枚举完。

for(int j=1;j<=m+xd[i];++j)
if(j-xd[i]>=0)
f[i][j]=min(f[i][j-xd[i]]+1, f[i-1][j-xd[i]]+1); // 向上跳
for(int j=mih[i];j<=mxh[i];++j)
f[i][j]=min(f[i][j], f[i-1][j+yd[i]]); // 向下落

但是题目还有高度限制,即如果跳到\(m\)以上,高度仍算\(m\),所以我们还要对于\(m\)以上转移一下

for(int j=m+1;j<=m+xd[i];++j)
f[i][m]=min(f[i][m], f[i][j]);

然后还要处理一下非法状态,因为之前枚举了所有状态。

for(int j=1;j<=mih[i]-1;++j) f[i][j]=INF;
for(int j=mxh[i]+1;j<=m+xd[i];++j) f[i][j]=INF;

AC Code

#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
#define MAXN 10010
using namespace std;
inline int read(){
char ch=getchar();int s=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9') s=s*10+(ch^'0'), ch=getchar();
return s;
}
int mxh[MAXN],mih[MAXN];
int xd[MAXN],yd[MAXN];
int f[MAXN][2002];
bool hav[MAXN];
int n,m,k;
int main(){
n=read(),m=read(),k=read();
for(int i=1;i<=n;++i) mxh[i]=m,mih[i]=1;
for(int i=1;i<=n;++i) xd[i]=read(),yd[i]=read();
for(int i=1;i<=k;++i){
int p=read(),l=read(),h=read();
hav[p]=1;
mih[p]=l+1;
mxh[p]=h-1;
}
memset(f, 0x3f, sizeof f);
for(int i=1;i<=m;++i) f[0][i]=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m+xd[i];++j)
if(j-xd[i]>=0)
f[i][j]=min(f[i][j-xd[i]]+1, f[i-1][j-xd[i]]+1);
for(int j=m+1;j<=m+xd[i];++j)
f[i][m]=min(f[i][m], f[i][j]);
for(int j=mih[i];j<=mxh[i];++j)
f[i][j]=min(f[i][j], f[i-1][j+yd[i]]);
for(int j=1;j<=mih[i]-1;++j) f[i][j]=INF;
for(int j=mxh[i]+1;j<=m+xd[i];++j) f[i][j]=INF;
//for(int j=mih[i];j<=mxh[i];++j) printf("f[%d][%d]=%d\n", i, j, f[i][j]);
}
int ans=INF;
for(int j=1;j<=m;++j)
ans=min(ans, f[n][j]);
if(ans<INF){
printf("1\n%d", ans);
return 0;
}
for(int i=n-1;i>=0;--i){
int tmp=INF;
for(int j=1;j<=m;++j)
tmp=min(tmp, f[i][j]);
if(tmp<INF){
ans=i;
break;
}
}
int cnt=0;
for(int i=0;i<=ans;++i)
if(hav[i]) ++cnt;
printf("0\n%d", cnt);
return 0;
}

飞扬的小鸟 DP的更多相关文章

  1. NOIP 2014飞扬的小鸟(DP优化)

    题目链接  飞扬的小鸟 考场的70分暴力(实际只有50分因为数组开小了……) 考场代码(数组大小已修改) #include <cstdio> #include <cstring> ...

  2. [NOIP2014]飞扬的小鸟[DP]

    [NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...

  3. P1941 飞扬的小鸟[dp]

    题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一不小心撞到了水管或者掉在地上的话,便宣 ...

  4. NOIP2014飞扬的小鸟[DP][WRONG]

    坑人啊朴素的dp 75分 用了完全背包才是80分,结果普遍偏小 为什么啊啊啊啊啊 等以后再写一遍吧 #include<iostream> #include<cstdio> #i ...

  5. luogu1941 [NOIp2014]飞扬的小鸟 (dp)

    设f[i][j]为到达(i,j)这个位置的最小操作数 就有$f[i][j]=min\{f[i-1][j+Y[i-1]],f[i-1][j-X[i-1]*k]+k\}$ 然后考虑优化一下转移: 对于一系 ...

  6. [NOIP2014][DP]飞扬的小鸟

    [NOIP2014]飞扬的小鸟 ——!x^n+y^n=z^n 题目描述: Flappy Bird 是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画 ...

  7. UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP

    #17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4902  Solved: 1879 题目连接 http:// ...

  8. LOJ2500 NOIP2014 飞扬的小鸟 【背包DP】*

    LOJ2500 NOIP2014 飞扬的小鸟 LINK 题目大意就是说有n个柱子,在每一秒你可以选择不点下降高度y和点p次上升x∗p,若果当前位置加上x∗p大于上界m,就会停在m. 如果可以成功穿越所 ...

  9. [DP]Luogu 2014NOIP提高组 飞扬的小鸟题解

    2014NOIP提高组飞扬的小鸟题解 题目描述 Flappy Bird是一款风靡一时的休闲手机游戏.玩家需要不断控制点击手机屏幕的频率来调节小鸟的飞行高度,让小鸟顺利通过画面右方的管道缝隙.如果小鸟一 ...

随机推荐

  1. Java操作Hadoop集群

    mavenhdfsMapReduce 1. 配置maven环境 2. 创建maven项目 2.1 pom.xml 依赖 2.2 单元测试 3. hdfs文件操作 3.1 文件上传和下载 3.2 RPC ...

  2. springboot笔记08——整合swagger2

    Swagger是什么? Swagger是一个RESTFUL 接口的文档在线自动生成和功能测试的框架.利用swagger2的注解可以快速的在项目中构建Api接口文档,并且提供了测试API的功能. Spr ...

  3. 有关Nodejs的一些插件介绍

    var child_process = require('child_process');这个可以执行cmd的命令 child_process.exec(cmdLine, function(error ...

  4. 【转载】Javascript使用Math.random()随机数函数生成1至1000的随机数

    在Javascript代码编写过程中,有时候我们需要使用Js来生成随机数,清除ajax的get请求缓存的时候我们会带上一个随机数来解决此问题,此外在其他应用中也可能使用到随机数,在Javascript ...

  5. 制作IOS ANE的基本流程

    来源:http://www.swfdiy.com/?p=1239 1. 使用xcode新建ios上的static library 工程 2. 从air sdk/include里拷贝flashrunti ...

  6. Github的fork进行同步

    最近项目要求每个开发人员都有自己fork,需要在自己的fork下进行开发.这样就涉及的到fork和原仓库的同步问题. 在网上查找到fork和原仓库同步的方法,如下转载自网上查找的内容,使用终端命令行进 ...

  7. Spring @Transactional注解不起作用解决办法及原理分析

    Transactional失效场景介绍 第一种 Transactional注解标注方法修饰符为非public时,@Transactional注解将会不起作用.例如以下代码. 定义一个错误的@Trans ...

  8. js 删除 数组中某个元素(转载)

    来源:https://www.jb51.net/article/134312.htm js删除数组中某一项或几项的几种方法 https://www.jb51.net/article/154737.ht ...

  9. linux学习记录--比较基本的文件档案知识

    [档案类型权限,连接数,档案拥有者,档案所属群组,档案容量,修改日期,档名],对应了上面的每一列的参数属性. 档案类型权限那一部分总共有十个字母,第一个字母代表档案类型: 当为[ d ]则是目录,例如 ...

  10. Docker容器化技术(下)

    Docker容器化技术(下) 一.Dockerfile基础命令 1.1.FROM - 基于基准镜像 FROM centos #制作基准镜像(基于centos) FROM scratch #不依赖任何基 ...