动态规划算法总结

什么是动态规划

  • 动态规划(Dynamic Programming),简称DP。如果某一问题有很多重叠子问题,使用动态规划是最有效的。动态规划最核心的思想,就在于拆分子问题,记住过往,减少重复计算

动态规划的解题步骤

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

  1. 确定状态标识,即确定dp数组以及下标的含义
  2. 确定状态转移方程
  3. 初始化dp数组,保证填表时不越界(递推公式决定了dp数组要如何初始化)
  4. 确定遍历顺序
  5. 根据题目要求和状态表示确定返回值

动态规划应该如何debug

找问题的最好方式就是把dp数组打印出来,看看究竟是不是按照自己思路推导的!

做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。然后再写代码,如果代码没通过就打印dp数组,看看是不是和自己预先推导的哪里不一样。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。如果和自己预先模拟推导的不一样,那么就是代码实现细节有问题。

这样才是一个完整的思考过程,而不是一旦代码出问题,就毫无头绪的东改改西改改,最后过不了,或者说是稀里糊涂的过了


题目列表

斐波那契数列模型

  • 509. 斐波那契数
  • 1137. 第 N 个泰波那契数
  • 70. 爬楼梯 - 力扣(LeetCode)
  • 面试题 08.01. 三步问题
  • 746. 使用最小花费爬楼梯

路径问题

  • 62. 不同路径
  • 63. 不同路径 II
  • 剑指 Offer 47. 礼物的最大价值 - 力扣(LeetCode)
  • 931. 下降路径最小和
  • 64. 最小路径和
  • 174. 地下城游戏

多状态dp问题

  • 198. 打家劫舍

  • 213. 打家劫舍 II

  • 面试题 17.16. 按摩师

  • 740. 删除并获得点数

  • LCR 091. 粉刷房子

股票问题

  • 121. 买卖股票的最佳时机
  • 122. 买卖股票的最佳时机 II
  • 123. 买卖股票的最佳时机 III
  • 188. 买卖股票的最佳时机 IV
  • 309. 买卖股票的最佳时机含冷冻期
  • 714. 买卖股票的最佳时机含手续费

子数组/子串问题

  • 53. 最大子数组和
  • 918. 环形子数组的最大和
  • 152. 乘积最大子数组
  • 1567. 乘积为正数的最长子数组长度
  • 413. 等差数列划分
  • 978. 最长湍流子数组
  • 139. 单词拆分
  • 467. 环绕字符串中唯一的子字符串

子序列问题

  • 300. 最长递增子序列
  • 674. 最长连续递增序列
  • 376. 摆动序列
  • 673. 最长递增子序列的个数
  • 646. 最长数对链
  • 1218. 最长定差子序列
  • 873. 最长的斐波那契子序列的长度
  • 1027. 最长等差数列
  • 446. 等差数列划分 II - 子序列

回文串问题

  • 647. 回文子串
  • 5. 最长回文子串
  • 1745. 分割回文串 IV
  • 132. 分割回文串 II
  • 516. 最长回文子序列
  • 1312. 让字符串成为回文串的最少插入次数

两个数组/序列的dp

  • 1143. 最长公共子序列
  • 1035. 不相交的线 - 力扣(LeetCode)
  • 115. 不同的子序列
  • 44. 通配符匹配
  • 10. 正则表达式匹配
  • 97. 交错字符串
  • 712. 两个字符串的最小ASCII删除和
  • 718. 最长重复子数组
  • 583. 两个字符串的删除操作
  • 72. 编辑距离
  • 392. 判断子序列

01背包问题

  • 【模板】01背包 (nowcoder.com)
  • 416. 分割等和子集
  • 494. 目标和
  • 1049. 最后一块石头的重量 II

完全背包问题

  • 【模板】完全背包(nowcoder.com)
  • 322. 零钱兑换
  • 518. 零钱兑换 II
  • 279. 完全平方数

二维费背包问题

  • 474. 一和零 - 力扣(LeetCode)
  • 879. 盈利计划

其他动规问题

  • 377. 组合总和 Ⅳ

  • 96. 不同的二叉搜索树

  • 91. 解码方法

  • 337. 打家劫舍 III

你可能感兴趣的:(常见算法,动态规划,C++,leetcode,牛客网)