1.背包
背包:0-1背包(每个物品个)、完全背包(每个物品无限个)
- 0-1背包关心第i个物品是否装。dp[i-1][j] (不装),dp[i-1][j-nums[]i] (装)
- 完全背包关心第i个物品是否装+装的是最后一个的情况。dp[i-1][j] (不装),dp[i][j-nums[i]] (装)
- 给定物品能够正好装满,动态规划
- 装的价值最多(有限个物品,无限个物品),动态规划
1.1背包问题总结
如果要按顺序,target在外面;如果重复,nums要正序
背包问题特征;给定一个target。target可以是数字也可以是字符串;在给定一个数组,数组中可能是数字,也可能是字符串;问:能够通过对nums排列组合得到target
三类:
第一类:组合问题: dp[i] += dp[i-num]
377. 组合总和 Ⅳ
494. 目标和
518. 零钱兑换 II
第二类:True、False问题: dp[i] = dp[i] or dp[i-num]
139. 单词拆分
416. 分割等和子集
第三类最大最小问题: dp[i] = min(dp[i], dp[i-num]+1)或者dp[i] = max(dp[i], dp[i-num]+1)
474. 一和零
322. 零钱兑换
背包问题技巧:
- 如果是0-1背包,即数组元素不可重复使用,nums放在外循环,target放在内循环,且内循环倒序
- 如果是完全背包问题,即数组的元素可重复使用,nums放在外循环,target放在内循环,且内循环正序
- 如果组合问题,需要考虑元素之间的顺序,需将target放在外循环,nums放在内循环,
2.回文
- 回文子串,中间往外扩散
- 回文子序列,动态规划
3.字符串匹配
- 两个字符串的最长公共序列,动态规划
- 两个字符串变为最长公共子序列的走法,动态规划
- 一个字符串变为另一个字符串的最少走法,动态规划
4.扔鸡蛋
- 扔鸡蛋确定楼层,动态规划
5.nSum
- twoSum->threeSum->…
6.不重叠区间
删除最少区间使得剩下的区间不重复,最多不重叠空间,使用最少的箭:最多不重叠空间问题