一、题目描述
一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台阶的阶梯,但是这猴子有一个习惯:
每一次只能跳1步或跳3步,试问猴子通过这个阶梯有多少种不同的跳跃方式?
二、输入输出描述
输入描述
- 一个整数N,表示此阶梯的总台阶数,0<N<=50。
输出描述
- 一个整数,代表猴子爬完所有台阶的总跳跃方式数。
三、示例
|----|-----------|
| 输入 | 50 |
| 输出 | 122106097 |
| 说明 | |
|----|---|
| 输入 | 3 |
| 输出 | 2 |
| 说明 | |
四、解题思路
1. 核心思想
使用动态规划(DP) ,把大问题拆解成小问题:爬到第 i 级的方案 = 前面某些级方案的和,通过递推公式一步步算出最终答案。
2. 问题本质分析
这是一个递推计数问题:
- 规则:每次只能爬 1 级 或 3 级
- 目标:求爬到第 n 级的总方案数
- 本质:用前面的结果推导后面的结果(无后效性)
3. 核心逻辑
- 状态定义 :
dp[i]= 爬到第 i 级台阶的方案数 - 递推公式 :
- 要到第 i 级,最后一步只有两种可能 :
- 从 i-1 级 爬 1 级 上来 → 方案数:
dp[i-1] - 从 i-3 级 爬 3 级 上来 → 方案数:
dp[i-3]
- 从 i-1 级 爬 1 级 上来 → 方案数:
- 所以:
dp[i] = dp[i-1] + dp[i-3]
- 要到第 i 级,最后一步只有两种可能 :
- 初始条件:手动给出前 3 级的答案
- 递推计算:从 4 到 n 依次算出每一级的方案数
4. 步骤拆解
- 输入:读取目标台阶数 n
- 定义 dp 数组:存储每级台阶的方案数
- 初始化边界 :
- dp[1] = 1
- dp[2] = 1
- dp[3] = 2
- 循环递推 :
- 从 4 到 n
- 用公式
dp[i] = dp[i-1] + dp[i-3]计算
- 输出结果 :输出
dp[n]
五、代码实现
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// dp[i] 表示爬到第i级台阶的方案数
long[] dp = new long[n + 1];
// 初始边界条件
if (n >= 1) {
dp[1] = 1;
}
if (n >= 2) {
dp[2] = 1;
}
if (n >= 3) {
dp[3] = 2;
}
// 动态规划递推
for (int i = 4; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 3];
}
System.out.println(dp[n]);
}
}