0004-猴子爬山

题目描述

一天一只顽猴想要从山脚爬到山顶,
途中经过一个有n个台阶的阶梯,
但是这个猴子有个习惯,每一次只跳1步或3步
试问?猴子通过这个阶梯有多少种不同的跳跃方式

输入描述

输入只有一个数n, 0 < n < 50
代表此阶梯有多个台阶

输出描述

有多少种跳跃方式

示例一

输入

50

输出

122106097

示例二

输入

3

输出

2

参考解题 Java-1

import java.util.Scanner;

public class Main0004 {
  public static void main(String[] args) {
    try (Scanner scanner = new Scanner(System.in)) {
      int n = scanner.nextInt();
      solution(n);
    }
  }

  private static void solution(int n) {
    int step1 = 1, step2 = 1, step3 = 2;
    int step4 = n == 1 || n == 2 ? 1 : 2;
    for (int i = 4; i <= n; i++) {
      step4 = step3 + step1;
      step1 = step2;
      step2 = step3;
      step3 = step4;
    }
    System.out.println(step4);
  }
}

参考解题 Java-2

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        long[] dp = new long[n + 1];// 创建一个长度为n+1的数组来保存跳跃方式数,初始值都为0
        dp[0] = 0;// 初始位置,只有0种方式
        dp[1] = 1;// 第一步跳1步,只有一种方式
        dp[2] = 1; // 第一步跳2步,只有一种方式
        dp[3] = 2; // 第一步走3步,第一步跳3步,只有两种方式
        // 计算每个位置的跳跃方式数
        for (int i = 4; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 3];
        }
        System.out.println(dp[n]);
    }
} 

参考解题java-3

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入阶梯数:");
        int num = scanner.nextInt();
        System.out.println(showF(num));
    }

    /**
     * 递归算法f(n) = f(n-1) + f(n-3);
     * f(1) =1;f(2) =1;f(3) = 2
     */
    public static long showF(int n) {
        if (n == 1 || n == 2) {
            return 1;
        }
        if (n == 3) {
            return 2;
        }
        return showF(n - 1) + showF(n - 3);
    }

}

参考解题 Python

n = int(input())

steps = [1, 1, 2]
res = 1 if n == 1 or n == 2 else 2
for i in range(4, n + 1):
    res = steps[2] + steps[0]
    steps = steps[1:] + [res]
print(res)

参考解题 C

#include <stdio.h>

int jumpWaysCount(int n) {
    if (n == 1) {
        return 1;
    }
    if (n == 2) {
        return 1;
    }
    if (n == 3) {
        return 2;
    }
    int dp[n + 1];  // 创建动态规划数组,用于存储跳跃方式数量
    dp[1] = 1;  // 初始化状态:1个台阶只有1种跳跃方式
    dp[2] = 1;  // 初始化状态:2个台阶只有1种跳跃方式
    dp[3] = 2;  // 初始化状态:3个台阶有2种跳跃方式
    for (int i = 4; i <= n; i++) {  // 从4个台阶开始计算跳跃方式数量
        dp[i] = dp[i - 1] + dp[i - 3];  // 使用状态转移方程计算跳跃方式数量
    }
    return dp[n];  // 返回通过n个台阶的不同跳跃方式数量
}

int main() {
    int n;
    printf("Enter the number of steps: ");
    scanf("%d", &n);  // 输入台阶数
    int ways = jumpWaysCount(n);  // 调用函数计算跳跃方式数量
    printf("Number of jump ways: %d\n", ways);  // 输出跳跃方式数量
    return 0;
}

参考解题C++

#include <iostream>
#include <vector>
using namespace std;

int countJumpWays(int n) {
    if (n == 0 || n == 1) {
        return 1;
    } else if (n == 2) {
        return 1;
    }

    // 创建一个长度为n+1的向量来保存跳跃方式数,初始值都为0
    vector<int> jumpWays(n + 1, 0);

    // 初始化前几个位置的跳跃方式数
    jumpWays[0] = 1;  // 初始位置,只有一种方式
    jumpWays[1] = 1;  // 第一步跳1步,只有一种方式
    jumpWays[2] = 1;  // 第一步跳2步,只有一种方式

    // 计算每个位置的跳跃方式数
    for (int i = 3; i <= n; i++) {
        jumpWays[i] = jumpWays[i - 1] + jumpWays[i - 3];
    }

    return jumpWays[n];
}

int main() {
    // 读取输入的阶梯台阶数
    int n;
    cin >> n;

    // 调用函数计算跳跃方式数
    int result = countJumpWays(n);

    // 输出结果
    cout << result << endl;

    return 0;
}

参考解题JS

function countJumpWays(n) {
    if (n === 0 || n === 1) {
      return 1;
    } else if (n === 2) {
      return 1;
    }
  
    // 创建一个长度为n+1的数组来保存跳跃方式数,初始值都为0
    const jumpWays = new Array(n + 1).fill(0);
  
    // 初始化前几个位置的跳跃方式数
    jumpWays[0] = 1; // 初始位置,只有一种方式
    jumpWays[1] = 1; // 第一步跳1步,只有一种方式
    jumpWays[2] = 1; // 第一步跳2步,只有一种方式
  
    // 计算每个位置的跳跃方式数
    for (let i = 3; i <= n; i++) {
      jumpWays[i] = jumpWays[i - 1] + jumpWays[i - 3];
    }
    return jumpWays[n];
  }
  // 读取输入的阶梯台阶数
  const readline = require('readline');
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });
  
  rl.question('请输入阶梯台阶数:', (n) => {
    // 调用函数计算跳跃方式数
    const result = countJumpWays(parseInt(n));
    // 输出结果
    console.log(result);
    rl.close();
  });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值