LeetCode 70. 爬楼梯

这是一道很经典的DP题,这里只去考虑最后一次到达终点的方式,要么是跳一阶台阶到达,要么是跳两阶台阶到达,只会存在这两种情况,那么我们可以列出下面这个式子:

num[i] = num[i-1] + num[i-2]

这里的num[i]是到达当前台阶的方法数之和,而到达这层台阶只有两种方式,一种是跳一次到达,一种是跳两次到达。num[i-1]即是到达第i-1阶台阶的方法数之和,num[i-2]即是到达第i-2阶台阶的方法数之和,二者之和即为到达当前台阶的方法数之和。思路有了,动手写代码,AC代码如下。

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

这里和剑指Offer 10-II. 青蛙的跳台问题一样,我这里也贴上一份AC代码(换了一种写法,思路上一样的),注意一点,这里需要对n为0时做特殊的处理。

class Solution {
public:
    int numWays(int n) {
        int cst = 1e9+7;
        int num1 = 1;
        int num2 = 2;
        int now = 3;
        if(n <= 3) {
            if(n == 0) {
                return 1;
            }
            return n;
        }else {
            for(int i=4;i<=n;i++) {
                num1 = num2;
                num2 = now;
                now = (num1 + num2) % cst;
            }
            return now;
        }
    }
};

你可能感兴趣的:(刷题之路,leetcode,动态规划,算法)