动态规划
动态规划 (dp) 是一种思想,并不一定要用来求解最优值(最大值或最小值),而且能够用来求解满足某种约束的答案。甚至高中阶段用到的排列组合其实就是动态规划一种。斐波那契数列是一个典型的 线性dp 问题。动态规划所说的 「最优子结构」就是问题能够分解为若干子问题,这些子问题可能存在重叠,然后就是子问题最优的时候原问题也一定最优。然后「后无效性」是说,动态规划的状态顶点之间,在逻辑上面是一个 『DAG 结构』,这是一个图,一个有向无环图(如果你觉得把逻辑结构想象为一个图有点抽象,可以尝试想想一些二分查找的过程逻辑上面等价于一个树),如果逻辑上面有环则将涉及一系列的破环技巧,比如插头 DP 等等。然后 up 提到 动态规划是一个带缓存的分治算法,这个观点是不对的,动态规划确实用到分治思想,但它与我们通过所说的『分治算法』有一点不一样,分治算法逻辑上面是一棵树,同一层的子问题是没有交集的,但是动态规划的子问题是一个有向无环图,是存在大量重叠的子问题的。然后最后up 提到的「这种方法叫做状态压缩」也是不对的,「状态压缩」是一种位运算技巧,此处用到的优化技巧叫做 「滚动数组」,不知道 up 是不是受到了 labuladong 影响,labuladong 有一篇高阅读量的题解提到了错把这个方法称为「状态压缩」,但是这种称呼是一个谬传,而且labuladong大部分的题解来自于 USA 力扣翻译,里面很多东西可能 labuladong 也不理解。