● 理论基础
● 509. 斐波那契数
● 70. 爬楼梯
● 746. 使用最小花费爬楼梯
理论基础
- 解决动态规划必须要想清楚的点
- dp数组以及下标的含义
- 递推公式
- dp数组如何初始化
- 遍历顺序
- 打印数组
- 检查结果
1. 斐波那契数
关联 leetcode 509. 斐波那契数
-
思路
- 动规五部曲
-
dp数组以及下标的含义
- dp[i] 就是第 i 个斐波那契数的值
-
递推公式
dp[i] = dp[i-1] + dp[i-2]
-
dp数组如何初始化
dp[0] = 0, dp[1] = 1
-
遍历顺序
- 从前往后遍历
-
打印数组文章来源:https://www.toymoban.com/news/detail-854962.html
- debug 使用
-
- 动规五部曲
-
题解文章来源地址https://www.toymoban.com/news/detail-854962.html
func fib(n int) int { if n < 2 { return n } dp := make([]int, n+1) dp[0] = 0 dp[1] = 1 for i := 2; i <= n; i++ { dp[i] = dp[i-1] + dp[i-2] } return dp[n] }
2. 爬楼梯
关联 leetcode 70. 爬楼梯
-
求走到三阶有几种方法
- 不是求走到三阶要走几步
- 当前台阶只能从
- 当前阶的前一阶 走一阶
- 当前阶的前二阶 走二阶
-
思路
-
dp数组以及下标的含义
dp[i]: 爬到第i层楼梯,有dp[i]种方法
-
递推公式
dp[i] = dp[i-1] + dp[i-2]
-
dp数组如何初始化
// 保证dp[1] 和 dp[2] 就好,dp[0]可以不用管 dp[1],dp[2] := 1,2
-
遍历顺序
- 从前往后遍历
-
打印数组
-
-
题解
func climbStairs(n int) int { if n < 3 { return n } dp := make([]int, n+1) dp[0] = 0 dp[1] = 1 dp[2] = 2 for i := 3; i <= n; i++ { dp[i] = dp[i-1] + dp[i-2] } return dp[n] }
3. 使用最小花费爬楼梯
关联 leetcode 746. 使用最小花费爬楼梯
-
思路
- 顶楼是 cost 数组+1 的位置
-
dp数组以及下标的含义
dp[i] : 到达下标i的位置所需要的花费
-
递推公式
// 跳一步到达 dp[i] = dp[i-1] + cost[i-1] // 跳两步到达 dp[i] = dp[i-2] + cost[i-2] // 最小花费 dp[i] = min(dp[i-1] + cost[i-1],dp[i-2] + cost[i-2])
-
dp数组如何初始化
// 根据dp数组定义来的初始化 dp[0],dp[1] := 0,0
-
遍历顺序
- 从前往后
-
打印数组
-
题解
func minCostClimbingStairs(cost []int) int { n := len(cost)//楼顶坐标 dp := make([]int, len(cost)+1) dp[0], dp[1] = 0, 0 for i := 2; i <= n; i++ { dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]) } return dp[n] }
4.题外话
- 爬楼梯
- 方案是固定的不要重复计算
- 从少一级的楼梯往上爬:还需要爬一步 —》唯一的一种方案
- 从少两级的楼梯往上爬:还需要两步 —》唯一的一种方案
- 方案是固定的不要重复计算
到了这里,关于代码随想录 day38 第九章 动态规划part01的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!