github pages blog addr
文章目录
0x00.绪论
动态规划(Dynamic Programming)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。同时也是各类信息学竞赛( Olympiad in Informatics )中较为常用的算法之一。
作为前·蒟蒻·OIer,对动态规划也是稍微了解一点点的XD,所以现在来简单刷一刷leetcode上动态规划的题Or2
最后更新日期2020.9.7
pre.什么是动态规划算法?
简单而言:
动态规划便是通过寻找出一个问题的重叠子问题/最优子结构来优化对问题的求解,将问题进行分阶段求解,并确保当前阶段是过于所有阶段的完美总结。
具体的可以看看我之前写的博文
0x01.难度:简单
0x00.爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/climbing-stairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
问题分析
简单分析:
-
上0级楼梯:有0种走法
-
上1级楼梯:有1种走法:直接跨一阶楼梯
-
上2级楼梯:有2种走法:①先跨一阶再跨一阶;②直接跨两阶楼梯
-
…
-
上N阶楼梯:①先走到第N-1阶,再跨一阶楼梯②先走到N-2阶,再一步跨两阶楼梯:一共是F(N-1)+F(N-2)种走法
也就是说,我们走n级楼梯的走法数量都可以化为①先走到第N-1阶,再跨一阶楼梯②先走到N-2阶,再一步跨两阶楼梯的走法
状态转移方程
F(N) = F(N-1) + F(N-2)
有了这个方程之后,我们只需要知道走1级楼梯的走法数量与走2级楼梯的走法数量,就可以顺利地推出走任意一级楼梯的走法数量
时间复杂度
需要求解n次,故时间复杂度为线性时间复杂度O(N)
空间复杂度
因为我们只需要使用三个变量迭代求解,故空间复杂度为O(1)
解决方案
C语言版:
int climbStairs(int n)
{
if(n == 0)
return 0;
if(n == 1)
return 1;
if(n == 2)
return 2;
int a = 1, b = 2, temp;
for(int i=2;i<n;i++)
{
temp = a;
a = b;
b += temp;
}
return b;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T2pcaZSt-1605852285729)(https://i.loli.net/2020/09/22/7bw2LteuRUhadgl.png)]
Python语言版:
class Solution: