关于对动态规划的思考 【转】

原文地址:https://blog.csdn.net/TSOI_Vergil/article/details/52934258  来自最强的Vergil学长。至理箴言:

 动态规划是一个考验技巧性的算法,对于动态规划算法,浅谈几点经验。

    首先是设计状态,我们肯定是要有一个一维或多维的状态的,那么如何设计它们的意义呢,首先我们可以分析出题目中的一些重要的量,比如当前时间,选了几个,考虑到了哪里,对于这些状态我们是要以一个值来表示这些状态的最优情况,比如f[i][j][k]..=P,i,j,k表示状态,P表示那个值,我们i,j,k,P都是这些重要的量,我们应该先把这些重要的量列出,然后感觉一下如何设计状态容易转移,一般来说设计了一个好的状态剩下的事情都比较好办。

    如果这个状态不是太好,我们可以考虑优化转移,我们可以再开一个别的数组维护我们转移的信息,比如说维护最小值,或者用高级数据结构维护,或者发现状态的一些性质,这样就能更快的转移。

    其实动态规划也是考虑了所有的状态,如果说你设计的DP没有将所有的状态考虑到,那么一定是错误的,动态规划的实质就是枚举了所有的状态,然后保留最大值。

    个人认为动态规划就是一个分类,动态规划的状态就是分类的标准,动态规划在每一中类别中都取得最优解,另外对于每个基本元素来说,一般都有几个状态,比如说背包问题中每个物品的选与不选,或者是这个元素放在哪个位置等等等等,考虑到每个元素的状态也有助于我们设计整体的状态。

 

优化: 连续一段和 前缀和
    连续带修改 线段树
    连续求最大值 线段树/ST表

posted @ 2018-08-28 18:57  cellur925&Chemist  阅读(312)  评论(0编辑  收藏  举报