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

182 阅读3分钟

题目解析

 

题目描述:

小U最近决定挑战一座非常高的楼梯,每次他可以选择走一步或两步,但有一个重要的限制:他不能连续走两步。因此,小U想知道他总共有多少种不同的方式可以从楼梯的底部走到顶端。 你需要帮他计算在给定的楼梯层数下,小U有多少种走法。  

思维详解: 相信但凡接触过基础动态规划的人对于爬楼梯问题都绝不会陌生,但是这道题做出了新的限制条件,即不可以连续走两步,把一道easy题变成了需要懂一点小脑筋的中等题。首先,让我们回顾一下基础爬楼梯问题,即没有不能连续走两步的条件限制。此时,上一层楼梯有一种方法,即走一个台阶;上二层有两种方法,连续走两步,或一步走两层台阶;以此类推,当我要求上到第n阶台阶有多少种方法时,该数量可以从上到第(n-1)层与上到第(n-2)层的方法数推导而出,因为每次上楼要么一次上一个台阶,要么一次上两个台阶。此时我们再加入新的限定条件,此时上到第n阶台阶有多少种方法该如何推到导。注意,上到第(n-1)层的方法数在此时依旧有效,因为题目限制的是不能连续走两步,但上到第(n-2)层的方法数已经失效,因为我无法保证当前上两步的前向迈步状态,因此,我需要把不确定性转化为确定性,确保迈步合法。现在我将上到第(n-3)层的方法数纳入推理考量,因为此时想要上到第n层,必须先上一阶,让后一口气上两阶,此时保证了迈步的合规性,即不能连续走两步。

 

代码详解:

首先初始化动态dp数组为(n+1)维全0数组;对数组前3维进行初始化,便于后续迭代;确定状态转移方程dp[i]=dp[i-1]+dp[i-3];最终代码如下所示:

public class Main {
    public static int solution(int n) {
        // Edit your code here
        int[] dp=new int[n+1];
        int result=0;
        if(n==0)
        {
            return 1;
        }
        if(n==1)
        {
            return 1;
        }
        if(n==2)
        {
            return 2;
        }
        dp[0]=1;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++)
        {
            dp[i]=dp[i-1]+dp[i-3];
        }
        return dp[n];
    }

    public static void main(String[] args) {
        // Add your test cases here
        
        System.out.println(solution(2) == 2);
    }
}

 

知识总结

本题实际上就是简单的爬楼梯问题,只不过稍微需要思维拐个弯。动规,考的就是思维。

 

学习计划

豆包MarsCode AI在我的刷题过程中给了我很大的帮助,千里之行始于足下,解题第一步就是读懂题,AI助手很好的为我明晰了题目要义。并且在解题过程中,AI助手也可以为我实时分析代码逻辑与漏洞,以防编程过程中的逻辑模糊现象,大大提升了解题效率。

 

工具运用

这里建议其他码友在题意不明时询问豆包AI,让其进行读题,明确题意。代码编程卡顿时借助AI对现有代码进行逻辑分析,获取接下来的解题思路,可有效提升效率,但要注意AI不是万能的,不能全部照抄,要融入自己的理解,才能获得最精确的题解。同时,如果发现代码于某些样例存在问题,可询问豆包AI当前代码是否存在边界问题没有考虑到。