奇怪的电梯(DP动态规划和BFS)
奇怪的电梯
题意:大楼的每一层楼都可以停电梯,每层楼均有一个数字,电梯只有两个按钮,相应的按钮:上和 下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮会失灵。例如,一楼的数字为3,则按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。
输入
输入共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的正整数,表示Ki。
输出
输出仅一行,即最少按键次数,若无法到达,则输出-1。
样例输入
5 1 5
3 3 1 2 5
样例输出
3
代码分析与讲解都在注释里,采用DP(动态规划来解答)
为了动态分配内存,采用STL的vector容器来解答,也可以简单的用数组来实现
#include <iomanip>
#include <iostream>
#include <vector>using namespace std;inline long long min(long long a, long long b) { return (a>b ? b : a); }int main()
{vector<vector<long long>> dp;//保存电梯动态规划所有解,dp[i][j]表示从第i层到第j层最少按得次数vector<long long> k;//保存电梯每一层可以上升或者下降的层数int n = 0;//n层电梯int start = 0;//开始层int end = 0;//目的层int tmp;cin >> n >> start >> end;for (int i = 0; i <= n; i++){vector<long long> v;for (int j = 0; j <= n; j++){if (i == j) v.push_back(0);//因为i == j ,所以dp[i][j]层不用按下,即0次v.push_back(INT_MAX);//INT_MAX为系统自带最大值,两个INT_MAX相加会越界,所以采用存储long long类型}dp.push_back(v);}k.push_back(0);//为了方便理解,先push一个0,使得下标从1开始for (int i = 1; i <= n; i++){cin >> tmp;k.push_back(tmp);}//首先初始化电梯按下1次即可到达的层数for (int i = 1; i <= n; i++){if (i + k[i] <= end){dp[i][i + k[i]] = 1;}if (i - k[i] >= 1){dp[i][i - k[i]] = 1;}}for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){for (int p = 1; p <= n; p++){//电梯从i到j层就是从i到p层加上从p到j层的次数,去最小值,动态规划dp[i][j] = min(dp[i][j], dp[i][p]+dp[p][j]);}}}
/*//输出最终数组答案,for (int i = 1; i <= n; i++){for (int j = 1; j <= n; j++){if (dp[i][j] == INT_MAX) //为了方便观察,将不能到达的值输出为-1{cout << setw(5) << -1;}else{cout << setw(5) << dp[i][j];}}cout << endl;}*/if (dp[start][end] == INT_MAX) //为了方便观察,将不能到达的值输出为-1{cout << -1;}else{cout << dp[start][end];}return 0;
}
代码分析与讲解都在注释里,采用BFS解答
为了动态分配内存,采用STL的vector容器和queue队列容器来解答,也可以简单的用数组来实现
#include <iostream>
#include <vector>
#include <queue>using namespace std;int main()
{queue<int> q; //BFS 实现用队列vector<int> v; //保存每层按钮上的数值vector<int> f; //到达每层最少的按键次数vector<bool> flag;//标记值,表示每层是否被访问过,true代表访问过int n;int start, end;//开始层和结束层int tmp;cin >> n >> start >> end;v.push_back(0);//方便起见,下标从1开始f.push_back(0);flag.push_back(false);for (int i = 1; i <= n; i++){cin >> tmp;v.push_back(tmp);if(i == start)f.push_back(0);//初始化,start层开始为按0次,其余层为-1次elsef.push_back(-1);flag.push_back(false);}q.push(start);while (!q.empty()&& !flag.at(q.front()))//队列不为空,切第q.front()层没有被访问过{flag.at(q.front()) = true;int next = q.front() + v.at(q.front());if (next <= n) //上楼{q.push(next);f.at(next) = f.at(q.front()) + 1;//记下到达每层最少的按键次数if (next == end) //找到end层,退出while循环{break;}}next = q.front() - v.at(q.front());if (next >= 1)//下楼{q.push(next);f.at(next) = f.at(q.front()) + 1;if (next == end)//找到end层,退出while循环{break;}}q.pop();}cout << f.at(end) << endl;return 0;
}
奇怪的电梯(DP动态规划和BFS)相关推荐
- P1135 奇怪的电梯(BFS/DFS)
来源:https://www.luogu.org/problemnew/show/P1135 题目描述 有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N ...
- 1.6.2 奇怪的电梯(BFS)
Description 有一天uncle-lu做了一个梦,梦见了一种很奇怪的电梯. 大楼的每一层楼都可以停电梯,而且i层楼上有一个数字.电梯只有四个按钮:开,关,上,下.上下的层数等于当前楼层上的那个 ...
- bfs总结 bfs题单 最短路 python (奇怪的电梯 好奇怪的游戏 迷宫 马的遍历 [USACO08FEB]Meteor Shower S)
1 可以用来遍历所有的点 2 可以用来找最短路 3 多源最短路,开始时一次向队列放之多个点#板子 """ def bfs():1 起始点入队标记入队的点while not ...
- (转)dp动态规划分类详解
dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...
- 奇怪的电梯(洛谷-P1135)
题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第 i 层楼 (1≤i≤N) 上有一个数字 Ki(0≤Ki≤N) .电梯只有四个按钮:开,关,上,下.上 ...
- 广度优先搜索——奇怪的电梯(洛谷 P1135)
广度优先搜索普及/提高篇,今天讲述的是洛谷里的一道题 奇怪的电梯(洛谷 P1135) 说一下我解题时候的思路吧. 首先读清楚题目,题目要求输出从 a楼 到 b楼的最少次数,楼层必须在[1,n]之间升降 ...
- 一本通1360:奇怪的电梯(lift)
1360:奇怪的电梯(lift) 大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)Ki(0≤=Ki≤=N).电梯只有四个按钮:开,关,上,下.上 ...
- 洛谷P1135:奇怪的电梯(lift)
题目 奇怪的电梯 - 洛谷 思路讲解 这道题主要用的是BFS(广度优先搜索),对电梯路径进行广搜,最后得出答案 广搜,全称广度优先搜索,相较dfs来讲,它更像是一个涟漪. 啥意思嘞?画一个图你就懂了 ...
- 洛谷 P1135 奇怪的电梯
P1135 奇怪的电梯 代码实现 #include <iostream> #include <cstring> #include <queue> using nam ...
- P1135 奇怪的电梯
题目描述 呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯.大楼的每一层楼都可以停电梯,而且第 i 层楼(1≤i≤N)上有一个数字 Ki(0≤Ki≤N).电梯只有四个按钮:开,关,上,下.上下的层 ...
最新文章
- 机器学习虽好,也要看什么场合
- awk多分隔符功能及wc命令案列及企业级应用
- SQL总结(一)基本查询
- Excel中这四个常出错的地方,你一定中过!
- python元编程_python元编程详解(3)
- SVN 冲突文件详解
- 由SELECT ... FROM ... FOR UPDATE想到的
- 清理localstorage_清除浏览器localstorage的数据
- hexo-theme-icarus配置 valine 评论系统
- c语言数组升序排列,数组输入各数之间用空格隔开,输出用空格隔开
- 寒武纪科技 服务器芯片,国内首款人工智能服务器诞生!搭载“寒武纪”芯片,走在世界前列...
- Robocup新手指南
- vue3中scrollTop不生效的问题
- redis学习笔记,常用方法
- C语言 有a,b,c,d4个数,要求按从大到小的顺序输出。
- 【翻译】Rosetta Large Scale System for Text Detection and Recognition in Images
- 手持式电波流速仪(SVR-VP)
- 泛生子Q3财报解析:癌症基因检测行业已呈现“燎原之势”
- C++高性能服务器框架——日志系统详解
- MIPI 系列之 DBI
热门文章
- (附源码)小程序 记账微信小程序 毕业设计 180815
- 【产业互联网周报】Azure云服务业务收入明年超Office;三星计划2021年芯片资本支出35万亿韩元;余承东挂帅华为云...
- 发现一款牛逼的 IDEA 插件:检测代码漏洞,一键修复!
- CentOS7 安装aria2
- 程序员如何实现“财务自由”?反正不是靠天天加班就能的!
- 地理信息安全在线培训考试系统题库-单选题
- rgb sw 线主板接口在哪_配置升级性能再突破,华硕TUF GAMING B460M-PRO 重炮手主板爆款来袭...
- python之数据处理篇
- python源码提取_从PyInstaller打包生成的EXE文件中提取Python源码
- 【Spring学习笔记七】-Spring MVC基本配置和实例