题目
代码结构
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层的所有可能走法数。