问题:
DP问题如何处理负数
子数组和为m,能否利用DP解决?前缀?
什么是DP
Dynamic Process(DP)是指满足最优子结构、无后效性、和有重叠子问题三个性质的求得最优解的方法。有重叠子问题不是DP的必要条件,但如果不具备的话,会使得DP在解决问题的时候丢失优势。DP是求解决策过程最优化的方法,决策过程就是可能分成多个阶段的。
- 最优子结构:问题是由多阶段构成,每个阶段的最优解会推到出整个问题的最优解
- 无后效性:后面的计算结果和决策不会影响之前阶段的决策
- 有重叠子问题:子问题之间不是独立的。这点和分治算法是不一样的,分治思想下的子问题是互相独立的,然后合成大问题的解。
简单直白的解释:之前计算的需要存储、不管以后怎么样当前就是最好的、每个阶段的状态算出来就不变了。
动态规划问题的关键步骤
以下没有标准答案,需要每题单独分析。
- 确定阶段
- 确定各个阶段的状态:这里的状态可以考虑和题目的要求匹配,例如题目是最大组合数,那状态就是在阶段i的最大组合数:cnt,如果题目是是否可以,那状态也是是否可以:true or false
- 确定各状态之间的转移方程(也就是递推关系)
背包问题
如何利用倒叙和一维数组降低只需要最后解(例如最大价值)的算法空间复杂度。
正序计算会导致后面计算出错,每次更新都是利用上一行楼上和前面的value计算,所以采用倒序方法,这个就是计算优化技巧了,和算法本身的思路无关。
状态转移表建议多算算,会有一些算法的启发和确定自己是否真的理解了需要解决的问题。
原始的dp方程可以多
👉🏻 环形偷盗问题为什么可以分解为两个单排偷盗的问题,因为特殊case互相包容了
需要注意的是,如果数组中存在负数的情况该怎么办呢?