#70-爬楼梯

假设你正在爬楼梯。须要 n 阶你才能到达楼顶。web

每次你能够爬 1 或 2 个台阶。你有多少种不一样的方法能够爬到楼顶呢?svg

注意:给定 n 是一个正整数。code

示例 1:xml

输入: 2
输出: 2
解释: 有两种方法能够爬到楼顶。递归

  1. 1 阶 + 1 阶
  2. 2 阶
    示例 2:

输入: 3
输出: 3
解释: 有三种方法能够爬到楼顶。
3. 1 阶 + 1 阶 + 1 阶
4. 1 阶 + 2 阶
5. 2 阶 + 1 阶it

解:这道题就是典型入门级别的动态规划问题。可是我如今比较模糊,貌似每个问题若是能用递归去解决的话,都是自上而下的方向进行解题。貌似与动态规划的方向相反了。下面是二者的区别io

不一样点:
1,分治法每每用到递归计算,自上而下计算,而动态规划则直接自底向上计算
2,分治大的小问题在递归的过程当中可能会被反复计算,动态规划中的小问题计算后被存储,下次再碰到时直接调用、
3,分治法的小问题的解只使用一次,动态规划的小问题的解存储以备大问题求解时反复调用入门

下面再来讲一下解题class

n=1:只能走一步
n=2:能走两个一步。能走一个两步
n=3:第一步只能是走一步,第二步能够走1个两步,或者 两个一步cli

当n=4,5,6的时候,能够发现当前步拥有的种类数就是前两步拥有种类数的和,
也就是 f(n) = f(n-1)+f(n-2);
因此咱们从第三步开始,由于前两步实际上是固定的
再者,咱们用一个vector去记录以往的每一步数自身所拥有多少种状况

class Solution {
public:
    int climbStairs(int n) {
        vector<int> result;
        
	    result.push_back(1);
	    result.push_back(2);
	    

	    for(int i = 3;i <= n;i++){
            result.push_back(result[i-2]+result[i-3]);     
        }
        return result[n-1];
    }
};