🚩传送门:牛客题目

题目

一只青蛙一次可以跳上[NC]261. 跳台阶扩展问题 - 图1级台阶,也可以跳上[NC]261. 跳台阶扩展问题 - 图2级……它也可以跳上[NC]261. 跳台阶扩展问题 - 图3级。求该青蛙跳上一个[NC]261. 跳台阶扩展问题 - 图4级的台阶([NC]261. 跳台阶扩展问题 - 图5为正整数)总共有多少种跳法。

数据范围:[NC]261. 跳台阶扩展问题 - 图6
进阶:空间复杂度 [NC]261. 跳台阶扩展问题 - 图7 , 时间复杂度 [NC]261. 跳台阶扩展问题 - 图8

示例1

输入:3 输出:4

解题思路:动态规划

👉 定义:[NC]261. 跳台阶扩展问题 - 图9 表示青蛙跳上第 [NC]261. 跳台阶扩展问题 - 图10 个台阶总共的跳法数

那么我们不难发现显然 [NC]261. 跳台阶扩展问题 - 图11

1是青蛙直接选择跳上第 [NC]261. 跳台阶扩展问题 - 图12 个台阶

由于[NC]261. 跳台阶扩展问题 - 图13
然而[NC]261. 跳台阶扩展问题 - 图14

🚩综上,状态转移方程:
[NC]261. 跳台阶扩展问题 - 图15

因此对于一个[NC]261. 跳台阶扩展问题 - 图16级的台阶,只需要将 [NC]261. 跳台阶扩展问题 - 图17即可

因为 [NC]261. 跳台阶扩展问题 - 图18

复杂度分析

时间复杂度: [NC]261. 跳台阶扩展问题 - 图19 ,其中 [NC]261. 跳台阶扩展问题 - 图20 是字符串[NC]261. 跳台阶扩展问题 - 图21长度,其中 [NC]261. 跳台阶扩展问题 - 图22 是字符串[NC]261. 跳台阶扩展问题 - 图23长度。

空间复杂度:[NC]261. 跳台阶扩展问题 - 图24 ,即为存储所有状态使用的空间。

我的代码

  1. import java.util.Scanner;
  2. public class Main {
  3. public static void main(String[] args) {
  4. Scanner in = new Scanner(System.in);
  5. int n = in.nextInt() - 1;
  6. System.out.println(1 << n); // 对于dp[5],只需要将 1 右移 4 次即可
  7. }
  8. }