代码随想录算法训练营第三十二天 |动态规划part01

60 阅读2分钟

代码随想录算法训练营第三十二天 |动态规划part01

五部曲方便复制版本

- 确定dp数组以及下标的含义
  - 
- 递推公式
  - 
- dp数组如何初始化
  - 
- 遍历顺序
  - 
- 打印dp数组
  - 

理论基础

解决五种问题

动态规划基础

  • 斐波那契数列
  • 爬楼梯

背包问题

打家劫舍

股票问题

子序列问题

动规五部曲

  • dp数组以及下标的含义

做状态转移的时候都会定义一个dp数组,我们要知道dp数组以及下标的定义。 dp[i] [j] dp[i] 都是什么意思

  • 递推公式
  • dp数组如何初始化
  • 遍历顺序
  • 打印dp数组

509 斐波那契数

image.png

思路:

  • 确定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 爬楼梯

image.png

  • 确定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 使用最小花费爬楼梯

image.png

image.png

  • 确定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]