力扣 70 爬楼梯

84 阅读1分钟

image.png

1<=n<=45

使用动态规划有五个步骤
  1. 确定dp数组及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

对于这个爬楼梯的题目,dp数组的每一项dp[i]可以表示爬到第i阶楼梯的方法总数。 到达第i级台阶,可以从它的前一级上去,也可以从它的前两级上去,分别是dp[i-1]和dp[1-2],这里需要注意从前两级上到第i级只是一种方法,不能误认为从前两级到第i级有两种方法,同样从前一级到第i级也只是一种方法。如果弄糊涂了,在写状态转移方程时就会错误地加上1和2。递推公式是dp[i]=dp[i-1]+dp[i-2]。初始化dp数组有n+1个元素,dp[1]=1,dp[2]=2,从i=3开始遍历。如果遇到边界条件比如n=1或n=2,由于从下标3开始遍历,要做是否n==1的判断,防止初始化dp[2]发生数组越界。

代码如下

class Solution 
{
public:
    int climbStairs(int n) {
        if(n==1)return 1;
        vector<int>dp(n+1,0);
        dp[1]=1,dp[2]=2;
        for(int i=3;i<n+1;i++){
            dp[i]=(dp[i-1]+dp[i-2]);
      }
        return dp[n];
    }
};