LeetCode 70. Climbing Stairs

尴尬,看了答案看不懂,求解释。答案如下

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

求解dp[i] = dp[i - 1] + dp[i - 2];这一步是为什么。

典型的动态规划算法

动态规划算法的思想就是,每次解决问题的一部分

后面的计算利用前面的结果,而不必每次从头算起。

这里开了一个dp的数组,每次计算一个台阶。

而当前台阶的走法是前面两个台阶走法的和。

爬楼梯 可以爬2阶或者1阶 就可以把整个过程分解
将最后一次爬分解出来

最后一阶就有两种情况
1. 爬了前N-1 阶 最后一阶 只需要爬1阶
2. 爬前N-2 阶 最后一阶爬两阶
所以 dp[i]=dp[i-1]+dp[i-1]

首先,把上i级台阶所有的方法数用dp[i]表示。
如果有i(i>2)级台阶的话,第一步有两种选择:一次上两级与一次上一级。
所以上i级台阶所有的方法数就等于dp[i]=dp[i-1]+dp[i-1]
然后这样递归下去。
我记得这是高中的排列组合题,当时老师也有讲这个方法。

这就是一个动态规划。