动态规划总结

来源:互联网 发布:java web项目搭建教程 编辑:程序博客网 时间:2024/06/06 00:27

是时候总结一波动态规划了。
对于一般的dp题来说,一般都比较能想出是dp的方向。
但第一步并不好想。
对于我而言,dp较难的是设计状态和转移方程。
总结了一下:
动态转移方程很多都是考虑两种情况,是或者否。
例如:背包就考虑取或者不取。树上染色就考虑染或者不染,而比如NOIP2015子串就考虑那一位取或者不取,当然情况可能会分的更复杂。
一个好的转移方程很大程度上取决于状态设计的巧妙与否。
而设计状态一般的套路有分析数据范围,一般来说dp的总状态数不能超过10的7次方—废话。此外还有什么建立二维【0/1】来方便方程的转移。还有什么降低维度,一般来说现有状态比如i都由i-1转移而来那么就有可能要降低维度,比如完全背包的状态设计。在最开始设计状态或者方程的时候一定不要想着一开始就想到正解,正解一般都是由暴力优化过来的,所以想到最直接的状态然后进行优化状态设计。
此外,在状态转移的时候,还要分析能不能运用优化,比如什么单调队列、斜率优化、四边形优化什么的云云。
更需要注意的是,我在最开始dp的时候只会考虑一次dp出答案,但其实可以用两次dp或者更多次dp来得出答案,例如当转移有些不好表达的时候,可以考虑再设计的一个状态来方便方程的转移,总而言之,dp就是运用状态的设计和之间的转移来间接得到最终答案的过程。
此外,要注意dp边界的取值,可以根据dp方程带具体值来试,也可以直接根据状态定义来设计边界取值。

原创粉丝点击