入门DP
基本思考方式:
选或不选
枚举选哪个
爬楼梯
枚举最后选哪个:当前状态 i (取x)=之前所有可能状态(取 i - x)的累加和
题目及其解析👇
F.动态规划-入门DP-爬楼梯:70. 爬楼梯
动态规划算法-斐波那契数列模型:3.使用最小花费爬楼梯
F.动态规划-入门DP-爬楼梯:3693. 爬楼梯 II
动态规划算法-似包非包:59.组合总数Ⅳ
F.动态规划-入门DP-爬楼梯:2466. 统计构造好字符串的方案数
F.动态规划-入门DP-爬楼梯:2266. 统计打字方案数
打家劫舍
选或不选:
①方案数型:前一个选或不选的方案数和
优化方式→式子合并:dp[i]=dp0[i-1]+dp1[i-1];
例题:F.动态规划-入门DP-打家劫舍:2320. 统计放置房子的方式数(有优化详解)
②累加和型:前一个选或不选的最大值+当前贡献
优化方式→单变量更新:dp=max(dp0+x,dp1);dp0=dp1;dp1=dp0;
例题:F.动态规划-入门DP-打家劫舍:198. 打家劫舍(有优化详解)
优化方式→式子合并:dp[i]=max(dp[i+1],dp[j+1]+nums[i][0])
例题:F.动态规划-入门DP-打家劫舍:2140. 解决智力问题(有优化详解)
注:爬楼梯类型属于②
题目及其解析👇
F.动态规划-入门DP-打家劫舍:198. 打家劫舍(累加和型)
动态规划算法-简单多状态dp问题:11.按摩师(累加和型)
动态规划算法-简单多状态dp问题:12.打家劫舍Ⅱ(累加和型)
F.动态规划-入门DP-打家劫舍:2320. 统计放置房子的方式数(方案数型)
动态规划算法-简单多状态dp问题:13.删除并获得点数(累加和型)
F.动态规划-入门DP-打家劫舍:3186. 施咒的最大总伤害(删除并获得点数的Plus版,优化方式在于对两个式子的整合,与之前的不同)
F.动态规划-入门DP-打家劫舍:2140. 解决智力问题(与施咒的最大总伤害基本相同,区别点已在博文内列出)
最大子数组和(最大子段和)
以 i 位置结尾……
由于 以 i 位置结尾时只有两种选择:继续接 或 重新开始
因此只与前一个状态dp[i-1]有关
dp[i]=Math.max(dp[i-1]+x,x);→也可写成dp[i]=Math.max(dp[i-1],0)+x;
可以用单一变量代替原本的数组来更新:
dp=Math.max(dp+x,x);→dp=Math.max(dp,0)+x;
注:乘法时不可以写成dp=Math.max(dp,0)×x;因为会有负负得正的情况,
因此要老老实实写dp=Math.max(dp×x,x)
题目及其解析👇
动态规划算法-子数组、子串系列:19.最大子数组和(模板题)
模板题的变形题👇
①整理一下”和“的定义:
F.动态规划-入门DP-最大子数组和(最大子段和):2606. 找到最大开销的子字符串
②求nums和的绝对值的最大值:
F.动态规划-入门DP-最大子数组和(最大子段和):1749. 任意子数组和的绝对值的最大值
③拼接 k 个相同的 nums:
F.动态规划-入门DP-最大子数组和(最大子段和):1191. K 次串联后最大子数组之和
④nums 是个环形数组:
动态规划算法-子数组、子串系列:20.环形子数组的最大和
⑤删除 nums 中的至多一个数:
F.动态规划-入门DP-最大子数组和(最大子段和):1186. 删除一次得到子数组最大和
⑥从nums1和nums2的差值数组中抽像出一个nums:
F.动态规划-入门DP-最大子数组和(最大子段和):2321. 拼接数组的最大分数
⑦求”最大和“改为”求最大积“:
动态规划算法-子数组、子串系列:21.乘积最大子数组