题目描述
一天一只顽猴想去从山脚爬到山顶,途中经过一个有个N个台阶的阶梯,但是这猴子有一个习惯:
每一次只能跳1步或跳3步,试问猴子通过这个阶梯有多少种不同的跳跃方式?
输入描述
输入只有一个整数N(0<N<=50)此阶梯有多少个台阶。
输出描述
输出有多少种跳跃方式(解决方案数)。
示例:
输入 | 50 |
---|---|
输出 | 122106097 |
说明 | 无 |
题目解析
这题是一道经典的分治算法题、以及动态规划基础题。
这题既可以使用分治递归来自顶向下地求解,也可以使用动态规划递推地自底向上求解。
但是动态规划的效率更高。
这题和fibnaci数列很像,递归公式如下:
- jump(1) = 1
- jump(2) = 1
- jump(3) = 2
- jump(n) = jump(n-1) + jump(n-3), n>3
状态转移方程如下:
- dp[0] = 0
- dp[1] = 1
- dp[2] = 1
- dp[3] = 2
- dp[i] = dp[i-1] + dp[i-3], i>3
Python算法源码
# 控制台输入获取
n = int(input())
# 算法入口
def get_result(n):
dp = [0] * (n + 1)
if n >= 1:
dp[1] = 1
if n >= 2:
dp[2] = 1
if n >= 3:
dp[3] = 2
for i in range(4, n + 1):
dp[i] = dp[i - 1] + dp[i - 3]
return dp[n]
# 调用算法并输出结果
print(get_result(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();
// 调用算法并输出结果
System.out.println(getResult(n));
}
// 算法入口
public static int getResult(int n) {
int[] dp = new int[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]; // 递推关系
}
return dp[n]; // 返回结果
}
}
1 条评论
[...]面试算法题LeetCode原题简单序列题目编号频次1605. 种花问题 - 力扣(LeetCode)12125. 验证回文串 - 力扣(LeetCode)131961. 检查字符串是否为数组前缀 - 力扣(LeetCode)14504. 七进制数 - 力扣(LeetCode)15344. 反转字符串 - 力扣(LeetCode)161184. 公交站间的距离 - 力扣(LeetCode)17594[...]