题目链接:

[NOIP2014 提高组] 飞扬的小鸟 - 洛谷

思路:

表示到达(i, j)点最少需要的跳跃次数。每个 f 值根据上一个对应位置,加上这一次的跳跃/下降得到。

计算完所有 f 值之后,倒序遍历,找出跳过的柱子数,以及最短跳跃次数即可。

需要注意几个点:

  1. 可以跳多次,所以非第一次跳的地方用到了完全背包。(注意:也正是因为这个,排除越界情况必须写在逻辑的最后面,因为第一次跳即使不在有效范围内也要算上,这样才能用完全背包)。
  2. 最高跳到m高度,所以对m高度做了一个特判。

代码: 

//要注意的点:
//1.鸟可以从任意高度出发
//2.可以点屏幕多次,跳跃效果叠加
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1e5+5, maxm = 1e3+5;
int n, m, k; //长度,最大高度,水管数量
int p, l, h, x[maxn], y[maxn], low[maxn], high[maxn]; //上升,下降。最低,最高高度
int f[maxn][maxm]; //f[i][j]表示飞到(i,j)需要的最少点击次数
int main(){//inputios::sync_with_stdio(false), cin.tie(0), cout.tie(0);cin>>n>>m>>k;for(int i=1; i<=n; i++) cin>>x[i]>>y[i];for(int i=1; i<=n; i++) low[i]=0, high[i]=m+1;for(int i=1; i<=k; i++) cin>>p>>l>>h, low[p]=l, high[p]=h;//initfor(int i=1; i<=n; i++)for(int j=0; j<=m; j++)f[i][j] = inf;f[0][0] = inf;//solvefor(int i=1; i<=n; i++){for(int j=x[i]+1; j<=m-1; j++){ //一般上升f[i][j] = min(f[i][j], f[i-1][j-x[i]]+1); //第一次跳f[i][j] = min(f[i][j], f[i][j-x[i]]+1); //非第一次跳}for(int j=m-x[i]; j<=m; j++){ //到顶上升的特判f[i][m] = min(f[i][m], f[i-1][j]+1); //第一次跳f[i][m] = min(f[i][m], f[i][j]+1); //非第一次跳}for(int j=0; j<=m-y[i]; j++) f[i][j] = min(f[i][j], f[i-1][j+y[i]]);for(int j=1;j<=low[i];j++) f[i][j]=inf; //越界(太低)for(int j=high[i];j<=m;j++) f[i][j]=inf; //越界(太高)}int cnt=k, ans=inf;for(int i=n; i>=1; i--){for(int j=low[i]+1; j<=high[i]-1; j++) ans=min(ans,f[i][j]);if(ans < inf) break; //能到达当前位置if(low[i]>0 || high[i] <= m) cnt--; //这里有柱子}if(cnt==k) cout<<1<<'\n'<<ans;else cout<<0<<'\n'<<cnt;
}

洛谷 飞扬的小鸟(混合背包,细节)相关推荐

  1. 洛谷 p1757 通天之分组背包(哈希,分组背包)2021-08-12

    题目背景 直达通天路·小 A 历险记第二篇 题目描述 自 01 背包问世之后,小 A 对此深感兴趣.一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品相互 ...

  2. 洛谷 P1049 装箱问题(01背包)

    一道水题,但看到好久没有发博客了,再一看是一道noip普及组t4,就做了. 题目链接 https://www.luogu.org/problemnew/show/P1049 解题思路 一道裸的01背包 ...

  3. 洛谷 P1757 通天之分组背包

    P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...

  4. 洛谷P1757 通天之分组背包 [2017年4月计划 动态规划06]

    P1757 通天之分组背包 题目背景 直达通天路·小A历险记第二篇 题目描述 自01背包问世之后,小A对此深感兴趣.一天,小A去远游,却发现他的背包不同于01背包,他的物品大致可分为k组,每组中的物品 ...

  5. P1616 疯狂的采药(洛谷,动态规划递推,完全背包)

    先上题目链接:P1616 疯狂的采药 然后放AC代码: #include<bits/stdc++.h> #define ll long long using namespace std; ...

  6. 洛谷1048 采药(01背包)

    传送门 [题目分析] 这个两维降一维妙妙妙啊...... 好吧我已经菜的做01背包了.... [代码~] #include<bits/stdc++.h> using namespace s ...

  7. 洛谷 P1208 [USACO1.3]混合牛奶 Mixing Milk

    P1208 [USACO1.3]混合牛奶 Mixing Milk 题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助Marry乳业找到最优的牛奶采购方案. Marry乳业 ...

  8. 洛谷P1757 通天之分组背包

    题目链接:点击进入 思路 分组背包,套板子 代码 #include<iostream> #include<string> #include<map> //#incl ...

  9. 洛谷 P1757 通天之分组背包 C++ dp

    题目背景 直达通天路·小 A 历险记第二篇 题目描述 自 0101 背包问世之后,小 A 对此深感兴趣.一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组,每组中的物品 ...

最新文章

  1. 鸿合一体机触屏没反应怎么办_【干货】嵌入式工控一体机选择电容屏还是电阻屏?...
  2. MOS管击穿原因和防护措施!
  3. vmalloc 实现
  4. 用于Web开发的8 个最好的跨平台编辑器
  5. 【Task5(2天)】模型调参
  6. 《dp补卡——买卖股票问题》
  7. .NETCore_生成实体
  8. Linux-lsof
  9. 数模比赛经验分享(美赛分享)
  10. 【Python系列】python文件或文本加密(4种方法)
  11. 创建LabwindowsCVI工程
  12. 圣诞节计算机音乐,圣诞节的背景音乐
  13. 怎么查看自己本地的ip地址
  14. ubuntu18打开网页慢的问题
  15. 笔记本win7做wifi热点
  16. Linux命令之expr详解
  17. 【数据库原理与应用MySQL版】实验指导
  18. 排序算法-归并排序详细图解
  19. 用iPhone一秒拍摄3D照片,Facebook这项技术厉害了
  20. Windows注册服务的两种方式,并设置服务开机自启

热门文章

  1. 有没有二维码制作工具?二维码制作其实很简单
  2. 【学习 记录】狄克斯特拉算法 - Java
  3. 基于OpenGL的Koch分形雪花实现
  4. 什么是P2P,O2O,B2B,B2C,C2C模式
  5. 【JQ _DOM】DOM
  6. 《你好,放大器》----学习记录(六)
  7. 蓝汛之获取DAC输出能量【篇】
  8. Kotlin协程序列:
  9. 高电平输入好还是rca输入好_汽车音响改装常识
  10. OpenCV库中watershed函数(分水岭算法)的详细使用例程