题目描述

一天一只顽猴想去从山脚爬到山顶,途中经过一个有个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]; // 返回结果
  }
}
最后修改:2024 年 05 月 02 日
如果觉得我的文章对你有用,请随意赞赏