关于dp问题的反思

来源:互联网 发布:女性就业歧视数据 编辑:程序博客网 时间:2024/05/20 18:51

关于dp问题的一点小反思

今天经过与金桔的谈话,发现以前做的dp根本就没有好好反思过。
在以前做dp题的时候,要么就是比较明显的dp,要么就是慢慢可以推出状态转移方程来的,根本就没有认真的想过到底什么是dp题,什么是非dp题,而掌握了这种技巧则可以省下大量的时间。
首先建议大家先去看dalao的博客,写的很好
http://blog.csdn.net/cangchen/article/details/45044811
读完之后,发现里面有几部分重点。
能用动态规划的题一般会满足三个性质:
最优子结构:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,每个阶段的最优状态可以从之前某个阶段的某个或某些状态直接得到。
无后效性:如果当前的状态是确定的,那么往后的状态不会影响当前的状态,就是说不管之前这个状态是如何得到的。
有重叠子问题:子问题之间不独立(这个性质不是必要性质)。

那么我们现在就可以反思,什么样的题可以用动态规划做,如我上一篇的二分答案的博客的那道题http://blog.csdn.net/bless924295/article/details/76167237,我一开始想的是dp,犯了经验的错误。所以我们可以考虑,那个题不满足dp的什么条件,首先,它满足无后效性,后面的状态并不能影响前面的状态,但是不满足最优子结构的性质,金桔教诲,找不到最优子结构也分好几种,有的并没有办法转移,有的是时间复杂度太高。那么对于这个题来说,我们考虑二维dp,会发现如果i代表磁头,那么j根本就不知道代表什么,金桔教导,要勇敢的加维,那么我们第一为代表时间,第二维代表磁头,第三维代表文件的状态,然后时间就爆炸了,所以这个题根本就不能用dp去做。


动态规划与分治法的区别:
分治即分而治之,我们把一个大问题分解成若干个子问题,子问题之间往往没有联系,这样,我们解决了所有小问题,大问题自然而然的就解决掉了。
动态规划则不一样,子问题之间往往不是独立的。这是动规和分治的最大的区别。


什么叫做状态转移方程:
很多人学动规往往直接就去做题(曾经的我),状态转移方程是动态规划中本阶段的状态往往是上一阶段状态和上一阶段决策的结果。所以我们碰到一个题,如果说确定了这是一个dp题,第一步就要划分出若干个阶段。

最后,了解一下动态规划的意义,推荐一个知乎:
https://www.zhihu.com/question/23995189
原创粉丝点击