其他分享
首页 > 其他分享> > #70-爬楼梯

#70-爬楼梯

作者:互联网

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

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

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

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。

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

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

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

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

下面再来说一下解题

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

当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];
    }
};

标签:楼顶,爬楼梯,一步,int,两步,result,70,动态
来源: https://blog.csdn.net/Francis_s/article/details/90610930