有限制的楼梯攀登 | 豆包MarsCode AI刷题

55 阅读2分钟

题目

image.png

代码结构

public class Main {

   public static int solution(int n) {

   if (n == 1) return 1;

   if (n == 2) return 2;

   int[] dp1 = new int[n + 1];

   int[] dp2 = new int[n + 1];

   dp1[1] = 1;

   dp1[2] = 1;

   dp2[1] = 0;

   dp2[2] = 1;

for (int i = 3; i <= n; i++) {

   dp1[i] = dp1[i - 1] + dp2[i - 1];

   dp2[i] = dp1[i - 2];

   }

   return dp1[n] + dp2[n];

   }

   public static void main(String[] args) {

   System.out.println(solution(2) == 2);

   System.out.println(solution(3) == 3);

   System.out.println(solution(4) == 4);

   }

}

详细解释

1. 方法 solution(int n)

这个方法用于计算小U从楼梯底部走到顶端的不同走法数。

  • 参数

    • n:楼梯的总层数。
  • 返回值

    • 返回小U从楼梯底部走到顶端的不同走法数。

2. 基本情况处理

if (n == 1) return 1;

if (n == 2) return 2;

  • 当楼梯只有1层时,只有一种走法(走一步),所以返回 1
  • 当楼梯有2层时,有两种走法(走一步再走一步,或者直接走两步),所以返回 2

3. 动态规划数组初始化

int[] dp1 = new int[n + 1];

int[] dp2 = new int[n + 1];

  • dp1[i]:表示到达第 i 层时,上一步是走了一步的走法数。
  • dp2[i]:表示到达第 i 层时,上一步是走了两步的走法数。

4. 初始条件

dp1[1] = 1;

dp1[2] = 1;

dp2[1] = 0;

dp2[2] = 1;

  • dp1[1] = 1:到达第1层时,只有一种走法,即走一步。
  • dp1[2] = 1:到达第2层时,上一步走了一步的走法数为1。
  • dp2[1] = 0:到达第1层时,上一步走了两步的走法数为0(因为不可能从第0层直接走两步到第1层)。
  • dp2[2] = 1:到达第2层时,只有一种走法,即走两步。

5. 动态规划数组填充

for (int i = 3; i <= n; i++) {

    dp1[i] = dp1[i - 1] + dp2[i - 1];

    dp2[i] = dp1[i - 2];

}

  • 循环从第3层开始,直到第 n 层。

  • dp1[i] = dp1[i - 1] + dp2[i - 1]

    • 如果上一步是走了一步(dp1[i-1]),那么这一步可以走一步或两步。
    • 如果上一步是走了两步(dp2[i-1]),那么这一步只能走一步。
  • dp2[i] = dp1[i - 2]

    • 如果上一步是走了两步(dp2[i-2]),那么这一步只能走一步。

6. 返回结果

return dp1[n] + dp2[n];

  • 最终结果是 dp1[n] + dp2[n],即到达第 n 层的所有可能走法数。

7. main 方法

public static void main(String[] args) {

    System.out.println(solution(2) == 2);

    System.out.println(solution(3) == 3);

    System.out.println(solution(4) == 4);

}

  • 在 main 方法中,我们添加了一些测试用例来验证 solution 方法的正确性。

总结

  • 该代码使用动态规划的方法来解决小U走楼梯的问题。
  • 通过定义两个状态数组 dp1 和 dp2,分别记录上一步走了一步和走了两步的走法数。
  • 通过循环填充动态规划数组,最终计算出到达第 n 层的所有可能走法数。