lintcode:272 · 爬楼梯 II

题目来源

题目描述

在这里插入图片描述

class Solution {
public:
    /**
     * @param n: An integer
     * @return: An Integer
     */
    int climbStairs2(int n) {
        // write your code here
    }
};

题目解析

一维坐标性动态规划

设起始坐标为0,要求到达终点坐标n一共有几种走法。每次可以走1、2、3步

(1)确定状态

  • 最后一步:
    • 不管怎么走,总有最后一步。最后一步的坐标为n,那么前一步可能是:
      • 情况一:前一步是n - 1
      • 情况二:前一步是n - 2
      • 情况三:前一步是n - 3
    • 题目要求知道从坐标0到达坐标n一共有几种走法,就要先知道:
      • 情况一:从坐标0到达坐标n - 1一共有几种走法
      • 情况二:从坐标0到达坐标n - 2一共有几种走法
      • 情况三:从坐标0到达坐标n - 3一共有几种走法
    • 然后把这三种坐标加起来就是一共有几种走法
  • 状态:
    • d p [ n ] dp[n] dp[n]为从坐标0到坐标n一共有几种走法

(2)转移方程

  • 一般情况: d p [ n ] = d p [ n − 1 ] + d p [ n − 2 ] + d p [ n − 3 ] , n > 3 dp[n] = dp[n - 1] + dp[n - 2] + dp[n - 3], n > 3 dp[n]=dp[n1]+dp[n2]+dp[n3]n>3
  • 当n = 0时,dp[0] = 1
  • 当n = 1时,从坐标0到坐标1一共有1种走法: d p [ 1 ] = 1 dp[1] = 1 dp[1]=1
  • 当n = 2时,从坐标0到坐标2一共有2种走法: d p [ 2 ] = 2 dp[2] = 2 dp[2]=2 前一步可能是
    • 前一个坐标是1 ---- 1
    • 前一个坐标是0 ---- 1
  • 当n = 3时,从坐标0到坐标3一共有4种走法: d p [ 3 ] = 4 dp[3] = 4 dp[3]=4 前一步可能是
    • 前一个坐标是2 — 2
    • 前一个坐标是1 — 1
    • 前一个坐标是0 — 1

(3)边界情况和初始条件

  • 如果n < 0,返回-1
  • 如果n = 0,返回1

(4)计算顺序

  • dp[0]、dp[1]、dp[2]、dp[3]、…dp[n]
  • 答案是dp[n]
class Solution {
public:
    /**
     * @param n: An integer
     * @return: An Integer
     */
    int climbStairs2(int n) {
        if(n < 0){
            return -1;
        }
        
        std::vector<int> dp(n + 1);
        dp[0] = 1;
        dp[1] = 1;
        dp[2] = 2;
        for (int i = 3; i <= n; ++i) {
            dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
        }
        return dp[n];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值