华为实习生面试题-跳跃比赛 C++实现

本文详细介绍了华为实习生招聘中的一道跳跃比赛题目,通过动态规划思路进行解答。题目要求根据一组正整数,计算以最少跳跃次数跳到最后一个数。分析过程包括题目描述、输入输出解释、示例分析以及动态规划的解决方案,并提供了C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

师兄参加了华为的实习生招聘,我也蹭了一下热闹。

一、题目描述

给出一组正整数,你从第一个数向最后一个数方向跳跃,每次至少跳跃1格,每个数的值表示你从这个位置可以跳跃的最大长度。计算如何以最少的跳跃次数跳到最后一个数。

输入描述

第一行表示有多少个数n

第二行开始依次是1到n个数,一个数一行

输出描述

输出一行,表示最少跳跃次数。

示例1

输入

7

2

3

2

1

2

1

5

输出

3

说明

7表示接下来要输入7个正整数,从2开始。数字本身代表可以跳跃的最大步长,此时有2种跳法,为2-2-2-5和2-3-2-5都为3步。

二、分析

一开始看到这题就觉得难受,好麻烦的题目,师兄和我说是用动态规划做,要写出迭代方程什么的。

仔细想过之后,想起运筹学中确实是这么解这一类题的,不过那是把方案一起解出来了——也就是题中的“2-2-2-5和2-3-2-5”。可是题目要求的答案只是“最少跳跃次数”,并没有说要给出方案,说明还是可以取巧的。

先整理一下规律,假设第i步到达了第k个位置(从0开始编号),那么前面所有的位置应该都能在第i步或第i步之前到达,在下图中标为橙色。


下面开始走一边用例。第0步,此时能到达的点就是起点,所以也就第一个点被标记。同时可以计算出下一step能到达的最远位置为2(第一个格子的位置0 + 该格中的数字2),也就是从左到右数第3个格子,接下来把能到达的格子涂色。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值