0%

总结-动态规划问题

动态规划问题思路与题型分类

基本思路

  1. 找到问题的状态(明确dp数组含义)(难点)
  2. 定义base case(填写数组边界值)
  3. 找到状态转移方程(难点)
  4. 填写dp数组

举例分析

先已知问题是动态规划找思路,再考虑如何判断属于动态规划

经典问题

746. 使用最小花费爬楼梯

70. 爬楼梯

62. 不同路径

63. 不同路径 II

背包问题

01背包

01背包

01背包的滚动数组

416. 分割等和子集

1049. 最后一块石头的重量 II

494. 目标和(组合问题)(装满背包)

474. 一和零(二维背包)

完全背包

完全背包

518. 零钱兑换 II(装满背包)

377. 组合总和 Ⅳ(排列问题)(装满背包)(难)

背包问题的总结

打家劫舍问题

子序列问题

思路:

  1. 确定dp数组含义:子序列问题一般都是以nums[i]为结尾的{所求代入}

  2. base case(边界)

  3. 状态转移方程:找dp[i]与dp[i-1]的关系,考虑dp[i-1]到dp[i]关于nums[i]有几种情况,再求这几种情况的最值

  4. 填表

最大子数组和

最长递增子序列

下降路径最小和

股票买卖问题

编辑距离问题

技巧型题目

非典型,靠经验

俄罗斯套娃信封问题

343. 整数拆分

96. 不同的二叉搜索树

动态规划的优化方法

空间压缩

dp[i]只与dp[i-1]有关,用一维数组代替二维数组,降低空间复杂度,要分清里层循环的方向

最大子数组和

0-1背包的滚动数组

如何判断一个问题是动态规划

根据题目给定的参数范围

Reference

https://labuladong.gitee.io/algo/3/23/67/