信息学奥赛一本通(C++版)在线评测系统
基础算法 第一节 动态规划的基本模型
1286:怪盗基德的滑翔翼
1. 理解题意
同学们,我们一起来看怪盗基德遇到的这个有趣问题哦。怪盗基德成功偷到了钻石,可倒霉的是他的滑翔翼动力装置被柯南破坏了。现在他在一个城市里,这个城市有一排建筑,一共有 N 幢,而且每幢建筑的高度都不一样呢。
基德可以从这一排建筑中的任意一幢的顶部开始他的逃跑旅程哦。不过他有两个限制条件:一是他只能朝着一个方向逃跑,而且在逃跑过程中不能改变方向;二是因为滑翔翼坏了,他只能从高的建筑滑到低的建筑。
那我们要做的就是算一算,在这些条件的限制下,基德最多能经过多少幢不同建筑的顶部呢,这里面可是包含他一开始所在的那幢建筑哟。比如说,题目给了我们一些建筑的高度数据,像 300,207,155,299,298,170,158,65,我们就要找出基德按照规则能经过的最多建筑数量。而且呀,题目中会给出好多组这样的建筑高度数据,我们都要一一算出答案呢。
2. 解题思路
那我们怎么来解决这个问题呢?其实呀,因为基德可以从左往右滑,也可以从右往左滑,所以我们要分别计算这两种情况下他能经过的最多建筑数量,然后取这两个结果里面较大的那个,就是基德最多能经过的建筑数量啦。
那怎么计算从左往右滑时能经过的最多建筑数量呢?我们可以从第一幢建筑开始,依次往后看每一幢建筑。对于每一幢建筑,我们看看它前面的建筑中,哪些比它高。然后记录下从那些比它高的建筑滑到当前建筑时,能经过的最多建筑数量,取其中的最大值再加 1(加上当前建筑本身),这样就能得到以当前建筑为终点时能经过的最多建筑数量啦。
从右往左滑的情况和从左往右滑是差不多的,只是方向反了过来,从最后一幢建筑开始往前看。最后把从左往右滑和从右往左滑得到的最多建筑数量进行比较,大的那个就是我们要的答案哦。
3. 解题步骤
- 输入测试数据组数:首先,我们要输入一个整数
k,这个k表示题目中会给我们k组不同的建筑高度数据哦。 - 对于每组测试数据:
- 输入建筑数量:输入一个整数
n,它代表这一组数据里有n幢建筑。 - 输入建筑高度:接着输入
n个不同的整数,这些整数就代表每幢建筑的高度啦,我们把它们存到一个数组h里。 - 计算从左往右滑的最多建筑数量:我们先创建一个数组
ltr(表示从左到右),用来存储以每幢建筑为终点时能经过的最多建筑数量,一开始把数组里的每个数都设为1(因为每幢建筑本身就算是经过了1幢建筑)。然后从第二幢建筑开始,对于每幢建筑,我们去看它前面的建筑,如果前面的建筑比它高,我们就更新当前建筑能经过的最多建筑数量(取当前值和前面建筑能经过的最多建筑数量加1里面较大的那个)。 - 计算从右往左滑的最多建筑数量:和从左往右滑的做法差不多哦,我们再创建一个数组
rtl(表示从右到左),从最后一幢建筑开始往前看,同样的,如果后面的建筑比当前建筑高,就更新当前建筑能经过的最多建筑数量。 - 比较并输出结果:最后我们比较从左往右滑和从右往左滑得到的最多建筑数量,把大的那个数输出,这就是基德在这一组建筑高度数据下最多能经过的建筑数量啦。
- 输入建筑数量:输入一个整数
4. C++代码实现
#include <iostream> // 包含输入输出流的头文件,这样我们就能输入和输出数据啦
using namespace std;
int main()


1194

被折叠的 条评论
为什么被折叠?



