代码随想录算法训练营第三十二天 |动态规划part01
五部曲方便复制版本
- 确定dp数组以及下标的含义
-
- 递推公式
-
- dp数组如何初始化
-
- 遍历顺序
-
- 打印dp数组
-
理论基础
解决五种问题
动态规划基础
- 斐波那契数列
- 爬楼梯
背包问题
打家劫舍
股票问题
子序列问题
动规五部曲
- dp数组以及下标的含义
做状态转移的时候都会定义一个dp数组,我们要知道dp数组以及下标的定义。 dp[i] [j] dp[i] 都是什么意思
- 递推公式
- dp数组如何初始化
- 遍历顺序
- 打印dp数组
509 斐波那契数
思路:
-
确定dp数组以及下标的含义
- dp[i] : 第i个斐波那契数智为dp[i]
-
递推公式
- dp[i] = dp[i-1] + dp[i-2]
-
dp数组如何初始化
- dp[0] = 0 dp[1] = 1
-
遍历顺序
- for i in range(2,n+1)
- 从前向后遍历
-
打印dp数组
- return dp[i]
if n == 0:
return 0
dp = [0] * (n+1)
dp[0] = 0
dp[1] = 1
for i in range(2,n+1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
70 爬楼梯
-
确定dp数组以及下标的含义
- dp[i] : 爬i个楼梯有dp[i]种方法
-
递推公式
- dp[i] = dp[i-1] + dp[i-2]
- dp[i]的值依赖于前两个值,因为只有前两个数才能到达这个数,
- dp[i-2] 迈两步可以到达
- dp[i-1] 迈一步可以到达
-
dp数组如何初始化
- dp[0] = 0
- dp[1] = 1
- dp[2] = 2
-
遍历顺序
- 从前向后遍历
-
打印dp数组
- return dp[n]
if n <= 1:
return n
dp = [0] * (n + 1)
dp[1] = 1
dp[2] = 2
for i in range(3, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]
746 使用最小花费爬楼梯
-
确定dp数组以及下标的含义
- dp[i] : 到达下标i时所需的最小花费
-
递推公式
- dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
- dp[i-1] 跳一步得到dp[i] 花费 cost[i-1]
- dp[i-2] 跳两步得到dp[i] 花费 cost[i-2]
-
dp数组如何初始化
- dp[0] = 0
- dp[1] = 0
- 到达0的位置花费为0,到达1的位置花费也为0,因为
你可以选择从下标为0或下标为1的台阶开始爬楼梯。
-
遍历顺序
- 从前往后遍历
-
打印dp数组
- return dp[n]
n = len(cost)
dp = [0] * (n + 1)
for i in range(2, n + 1):
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
return dp[n]