动态规划的特点有最优子结构和大量的重复计算。计算的过程就是一个化繁为简的过程。在这其中需要考虑所有的情况,列举所有的解,想要化繁为简,所以运用了最优化原理,但是每个动态规划问题都有其特殊性,或者很难找到最优子结构,或者很难找到重复子问题。为了更模式化的,条例更清晰的解决dp,我搜索了一些方法。
动态规划算法三要素:
①所有不同的子问题组成的表②解决问题的依赖关系可以看成是一个图③填充子问题的顺序
通过这样的一个三要素来做题,确实思路会明确一些,主要是找到了子问题之间的关系。这样就便于划分阶段,便于对元素通过时间和空间等来定义状态。状态设计完之后在依据着依赖关系进行状态转移。
在最开始设计状态或者方程的时候一定不要想着一开始就想到正解,正解一般都是由暴力优化过来的,所以想到最直接的状态然后进行优化状态设计。
更需要注意的是,我在最开始dp的时候只会考虑一次dp出答案,但其实可以用两次dp或者更多次dp来得出答案,例如当转移有些不好表达的时候,可以考虑再设计的一个状态来方便方程的转移,总而言之,dp就是运用状态的设计和之间的转移来间接得到最终答案的过程。
此外,要注意dp边界的取值,可以根据dp方程带具体值来试,也可以直接根据状态定义来设计边界取值。边界的问题其实是很烦的,因为在状态设计的时候就需要单独拿出来,是需要时常注意的问题。