算法训练营day33 | {509.斐波那契数, 70.爬楼梯, 746.使用最小花费爬楼梯}
第九章动态规划part01,用动态五部曲分析问题,打通雾霭。
0. 理论基础
动态规划(Dynamic Programming),简称DP,用DP解决问题是从前一个状态推导出来的,而贪心是局部直接选最优的。
0.1 动态规划五部曲
- 确定dp数组以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组
0.2 动态规划debug
做动规的题目,写代码之前一定要把状态转移在dp数组上模拟一遍,心中有数是想要的结果;然后写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样:
- 如果不一样那就是代码实现细节有问题;
- 如果一样,那就是自己的递推公式、初始化或者遍历顺序出问题了。
0.3 动态规划刷题大纲
▶
DP刷题大纲
509. 斐波那契数
- 题目链接:509. 斐波那契数
- 文档讲解:代码随想录
- 视频讲解:手把手带你入门动态规划 | LeetCode:509.斐波那契数
- 状态:掌握做题方法。
1.1 解题分析
动规五部曲:
- 确定dp数组以及下标的含义:dp[i]的定义为下标为i的斐波那契数列数值是dp[i]
- 确定递推公式:dp[i] = dp[i - 1] + dp[i - 2]
- dp数组如何初始化: dp[0] = 0, dp[1] = 1
- 确定遍历顺序: 因为dp[i]依赖dp[i - 1]和dp[i - 2],所以从前往后遍历
- 举例推导dp数组: 0 1 1 2 3 5 8 13 …
▶
509. 斐波那契数1 | |
进一步,因为本题只要求dp[n],可以进行状态压缩,只维护两个数值就可以了,不需要记录整个序列。
▶
509. 斐波那契数1 | |
70. 爬楼梯
- 题目链接:70. 爬楼梯
- 文档讲解:代码随想录
- 视频讲解:带你学透动态规划-爬楼梯(对应力扣70.爬楼梯)| 动态规划经典入门题目
- 状态:依旧用动规五部曲分析。
2.1 解题分析
动规五部曲:
- 确定dp数组以及下标的含义:dp[i]的定义为爬到第i层楼梯有dp[i]种不同的方法
- 确定递推公式:dp[i] = dp[i - 1] + dp[i - 2]
- dp数组如何初始化: dp[1] = 1, dp[2] = 2
- 确定遍历顺序: 因为dp[i]依赖dp[i - 1]和dp[i - 2],所以从前往后遍历
- 举例推导dp数组: 1 2 3 5 8 13 …
▶
70. 爬楼梯1 | |
746. 使用最小花费爬楼梯
- 题目链接:746. 使用最小花费爬楼梯
- 文档讲解:代码随想录
- 视频讲解:动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯
- 状态:题目意思是在某一节台阶上往上跳要花费费用。
3.1 解题分析
动规五部曲:
- 确定dp数组以及下标的含义:dp[i]的定义:到达第i台阶所花费的最少体力为dp[i]
- 确定递推公式:dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
- dp数组如何初始化: dp[0] = 0 dp[1] = 0
- 确定遍历顺序: 因为dp[i]依赖dp[i - 1]和dp[i - 2],所以从前往后遍历
- 举例推导dp数组: 例如cost[]数组
[10,15,20]:0 0 10 15
▶
746. 使用最小花费爬楼梯1 | |
算法训练营day33 | {509.斐波那契数, 70.爬楼梯, 746.使用最小花费爬楼梯}
http://paopaotangzu.xyz/cn/day33_leetcode/