通过率 57% · 提交 506 · 通过 286
小慕正在完成一个登山项目,途中遇到一段有 n 级台阶的阶梯。不过小慕有一个习惯,每次只前进 1 步或 3 步。 请问小慕通过这段阶梯有多少种不同的前进方式。
这类题属于华为 OD 机考真题方向中「100分 / DP」方向的高频题型,通常考察对「100分 / DP」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入只有一个数 n, 0 <= n <= 50,代表此阶梯有多个台阶。
一个整数,表示有多少种跳跃方式。
示例 1
输入示例
50
输出示例
122106097
示例 2
输入示例
3
输出示例
2
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
注意:本题和 爬楼梯 几乎完全一致。唯一区别在于,猴子更加调皮,每次是跳 1 或 3 个台阶,而不是 1 或 2 个台阶。
dp 数组 是一个长度为 n+1 的一维列表,dp[i] 表示猴子到达第 i 个台阶一共有多少种跳跃方式。
跳跃到第 i 个台阶的方法数 dp[i],等于到达其前一个台阶的方法数 dp[i-1],加上到达其前三个台阶的方法数 dp[i-3] 之和。即存在:
关键结论:第 0、1、2 个台阶均只有 1 种跳跃方式 到达。
考虑完上述问题后,代码其实呼之欲出了。
思路展开 把走台阶的方案按最后一步分类:小慕到达第 i 级台阶时,最后一步要么是从第 i-1 级跳 1 步上来,要么是从第 i-3 级跳 3 步上来,这两类方案互不重叠也不遗漏,所以 dp[i] = dp[i-1] + dp[i-3]。dp 数组长度为 n+1,dp[i] 表示到达第 i 级台阶的方案总数。起点 dp[0] = 1 表示还没起跳时算一种基础状态;第 1、2 级台阶只能靠连续跳 1 步到达,各只有一种走法,所以 dp[1] = dp[2] = 1。主循环从 i = 3 开始逐级向后推,每个 dp[i] 只依赖前面已经算好的 dp[i-1] 和 dp[i-3],最后输出 dp[n] 即为答案。 复杂度分析 设 n 为台阶总数。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。