动态规划理论基础
https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
视频:https://www.bilibili.com/video/BV13Q4y197Wg
- 主要题型
- 动规基础题
- 斐波那契数列(爬楼梯)
- 背包问题
- 打家劫舍
- 股票问题
- 子序列问题
- 动规基础题
- 解题五步走
- dp数组及下标的含义
- 递推公式
- dp数组的初始化
- 遍历顺序
- 打印dp数组(用于debug)
509. 斐波那契数
https://programmercarl.com/0509.%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0.html
视频:https://www.bilibili.com/video/BV1f5411K7mo
- 考点
- 动规
- 我的思路
- 不自觉地就用动规五部曲写出来了
- 视频讲解关键点总结
- 动规五部曲
- 确定dp数组及其下标含义
- dp为斐波那契数列,dp[i]为第i个斐波那契数
- 递推公式
- dp[i] = dp[i - 1] + dp[i + 1]
- 初始化
- dp[0] = 0
- dp[1] = 1
- 遍历顺序
- 前到后
- 打印
- 本题无须debug
- 我的思路的问题
- 无
- 代码书写问题
- 无
- 可执行代码
class Solution:def fib(self, n: int) -> int:fib_list = [0, 1]if n == 0:return 0if n == 1:return 1for i in range(2, n + 1):fib_list.append(fib_list[i - 2] + fib_list[i - 1])return fib_list[n]
*70. 爬楼梯
https://programmercarl.com/0070.%E7%88%AC%E6%A5%BC%E6%A2%AF.html
视频:https://www.bilibili.com/video/BV17h411h7UH
- 考点
- 动规
- 爬楼梯(斐波那契数列)
- 我的思路
- 无思路
- 视频讲解关键点总结
- 对于第n个台阶,有两种方式能走到它,第一种是从第n-2个台阶上迈两阶上来,第二种是从第n-1个台阶上迈一阶上来,因此,上到第n个台阶的方法总数等于上到第n-2个台阶和第n-1个台阶的方法数量和,也就是斐波那契数列
- 动规五部曲
- dp数组下标i的含义是上到第i-1个台阶有多少种方法
- 递归公式和上一题相同
- 初始化和上一题相同
- 遍历顺序和上一题一样
- 无需打印dp数组
- 我的思路的问题
- 无思路
- 代码书写问题
- 无
- 可执行代码
class Solution:def climbStairs(self, n: int) -> int:result = [1, 2]for i in range(2, n):result.append(result[i - 1] + result[i - 2])return result[n - 1]
*746. 使用最小花费爬楼梯
https://programmercarl.com/0746.%E4%BD%BF%E7%94%A8%E6%9C%80%E5%B0%8F%E8%8A%B1%E8%B4%B9%E7%88%AC%E6%A5%BC%E6%A2%AF.html
视频讲解:https://www.bilibili.com/video/BV16G411c7yZ
- 考点
- 动规
- 爬楼梯(斐波那契数列)
- 我的思路
- 思路有偏差,想着从后向前遍历依次将最小值相加,但实际上这样没有递推,得不到最优解
- 视频讲解关键点总结
- 有两点需要明确:1,站在台阶上不花钱,只有走上去才花钱,因此初始化时,第0和1个台阶的dp数均为0;2,最后要迈过最后一个台阶,也就是如果20个台阶,要走到第21个“台阶”才完成任务
- 动规五部曲
- dp数组下标i代表爬过第i个楼梯的最小花费
- 递推公式为当前dp值等于第i-1个台阶最小花费+其自身花费和第i-2个台阶最小花费+其自身花费中的较小者
- 初始化,dp的第0个和第1个位置赋值为0
- 从前向后遍历
- 无需打印
- 我的思路的问题
- 思路错误
- 代码书写问题
- 无
- 可执行代码
class Solution:def minCostClimbingStairs(self, cost: List[int]) -> int:dp = [0, 0]for i in range(2, len(cost) + 1):dp.append(min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]))return dp[-1]