Day32 动态规划 part01

60 阅读1分钟

基础

动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。

对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组 (主要是debug)

刷题

  1. 斐波那契数列

leetcode.cn/problems/fi…

image.png

  • 确定dp数组,dp[i]的含义:第i个斐波那契数
  • 确定递推公式:dp[i] = dp[i-1] + dp[i-2]
  • 确定dp数组初始化:dp[0] = 1, dp[1] = 1
  • 确定遍历顺序:从前往后
  • 打印dp数组
  1. 爬楼梯

leetcode.cn/problems/cl…

image.png

  • 确定dp数组,dp[i]含义:爬到第i阶楼梯
  • 确定递推公式:dp[i]=dp[i-1]+dp[i-2]. 难点
  • 确定dp数组初始化:dp[0]没有意义,dp[1] = 1, dp[2] = 2
  • 确定遍历顺序: 从前往后
  • 打印dp数组
  1. 使用最小花费爬楼梯

leetcode.cn/problems/mi…

image.png

  • 确定dp数组,dp[i]含义: 爬到第i阶楼梯需要的的花费+本阶楼梯的花费,最后一阶的本阶楼梯花费为0
  • 确定递推公式: dp[i] = min(dp[i-1], dp[i-2]) + cost[i]
  • 确定dp数组的初始化:dp[0] = cost[0], dp[1] = cost[1]
  • 确定遍历顺序: 从前往后
  • 打印dp数组

总结