动态规划总结

  1. 什么是动态规划
  2. 动态规划算法步骤
  3. 大量练习

总结

动态规划的四个步骤:

  • 定义状态数组
  • 初始化状态是数组
  • 状态转移
  • 返回最终需要的状态值

问题--->穷举---->抽象出树形结构---> DFS/回溯---->记忆化搜索---> 状态定义/状态转移

状态转移:

  • 自底而上演示
  • 填表法

动态规划的三个特征

  1. 存在重复子问题
  2. 无后效性(后面的选择不会影响前面的选择)
  3. 最优子结构

无后效性:一个状态的状态值一旦被确定,那么这个状态值不受后面的状态的影响。

最优子结构:

每个状态的状态值都是最优的,后面的状态的状态值可以由前面的一个状态 或者多个状态的状态值推导出来。

动态规划求解的问题

动态规划求解的问题 最优值

动态规划可以解决的问题

  1. 求"最"优解问题(最大值和最小值)

    • 152 乘积最大子数组

    • 409 最长回文串

    • 300 最长递增子序列

  2. 求可行性(TRUE或者FALSE)

    • 零钱兑换(322)

    • 交错字符串(97)

  3. 求方案总数

    • 零钱兑换②(518)

    • 不同路径(62)

动态规划分类

  1. 线性DP问题
  2. 区间DP问题
  3. 背包系列DP问题
  4. 状态压缩DP问题(偏竞赛)
  5. 数位DP问题(偏竞赛)

线性DP问题

单数组/单字符串

特点:dp[i]依赖于前面一个或者两个状态计算得到

  1. 打家劫舍 198

  2. 最大子数组和 53

  3. 解码方法 91

  4. 乘积最大子数组 152

  5. 摆动序列 376

  6. 打家劫舍②

  7. 斐波那契数列

  8. 爬楼梯问题

  9. 使用最小花费爬楼梯


依赖前面多个状态得到

  1. 300最长递增子序列 LIS

    dp[i]表示数组区间[0...i]的【最长递增子序列的长度】

    注意:必须以nums[i]结尾,也就是说必须选择nums[i]

  2. 354俄罗斯套娃问题

  3. 32最长有效括号

  4. 139单词拆分


带有一个或者多个维度

股票系列问题

  1. 121
  2. 122
  3. 123
  4. 188
  5. 309
  6. 714

双数组/双字符串
  • 经典LCS问题

    1. 1143 最长公共子序列

    2. 718最长重复子数组

  • 字符串匹配问题

    1. 10正则表达式匹配问题
    2. 44通配符匹配
    3. 72编辑距离
  • 其他

    1. 97 交错字符串
    2. 115 不同的子序列
输入为矩阵
  1. 64 最小路径和
  2. 62不同路径
  3. 63不同路径②
  4. 120三角形最小路径和
  5. 97交错字符串

区间DP问题

dp[i][j]表示数组/字符串区间[i,j]对应的子数组/字串的状态值。

dp[i][j]一般可以由dp[i+1][j],dp[i][j-1]dp[i-1][j-1]推导而来的。

回文问题
  1. 5最长回文字串
  2. 131分割回文串
  3. 516最长回文子序列
  4. 647回文字串
其他
  1. 486预测赢家

背包系列问题

一、0-1背包问题
  1. 416分割等和子集
  2. 494目标和
二、完全/多重背包问题
  1. 139单词拆分
  2. 279完全平方数
  3. 322零钱兑换
  4. 518零钱兑换②
  5. 377组合总和
三、二维费用背包
  1. 474 一和零

作业

  1. 740 删除并获得节点数 打家劫舍模型

  2. 413 等差数列划分

  3. 918环形子数组的最大和

  4. 673最长递增子序列的个数

  5. 368最大整除子集

  6. 256粉刷房子

  7. 410分割数组的最大值

  8. 813最大平均值和的分组

  9. 1207最长等差数列

  10. 1230抛掷硬币

  11. 583两个字符串的删除问题

  12. 712两个字符串的最小ASCII 删除和

  13. 931下降路径最小和

  14. 221最大正方形

  15. 132分割回文串

  16. 1312让字符串成为回文串的最少插入次数

  17. 312戳气球

  18. 1049最后一块石头的重量②

posted @ 2023-07-30 23:19  Jonathan1  阅读(21)  评论(0编辑  收藏  举报