区间DP(多叉树的遍历,LA 3516)

来源:互联网 发布:淘宝培训课程表 编辑:程序博客网 时间:2024/05/29 13:24

放在数学专题里,想不出数学的方法,但觉得可以用区间DP求解。如果是二叉树就很好解决,只用枚举一下中间的回归点就好,复杂度O(n^3)。但是偏偏求得是多叉树,自己只能想到位向量枚举集合或者dfs的方法。可以剪枝但无法避免最差情况,然后就不会了。


最近在紫书和大白书上做了很多动态规划的题目,有了很多感触,看了这道题的解法后又有了新的理解。

就是说动态规划不一定只能从旧状态转移到新状态,也可以由旧状态+新状态转移到新状态。从而优化了时间复杂度

值得注意的是,状态的定义是唯一的,但是转移的方法却可以十分风骚。


比如:http://blog.csdn.net/xl2015190026/article/details/53027476

在上面链接的这道题中,新一层的状态就是由旧一层的状态加新一层的状态得到,但要注意遍历的方向。当然这也可以只由旧一层的状态得到,但是时间复杂度会高一个维,这是很致命的。

之所以说风骚,是因为不但加入了讨论,而且转移方程中的两个状态不是一个维度的里的东西。

不知道该怎么解释= =。不是一个维度的意思是,一个是旧一层,一个是新一层,想要联系起来不是那么容易。


在这道题中,也有着相似的情况。因为是区间DP,所以没有新旧层的说法,取而代之的是大小区间。一般而言,大区间会比所有比他小的区间后更新,常规解法是大区间分成两个小区间,然后枚举一下分割点,求和或最优。但在这道题里大区间分成小区间的个数可以是随意的,难道要暴力枚举小区间的个数,再暴力枚举分隔位置吗?答案是否定的= =。之所以实现起来那么麻烦,以及时间复杂度那么高的主要原因就是状态转移不够风骚。


区间DP想要优化,那么对于每一个区间,你最好只能枚举一个量,大白书中的方法就是枚举第一个分支的坐标(枚举第一个XX的位置,这在动态规划里是一个常见的技巧)。这个坐标如果合法,那么坐标左边就是有一棵子树,坐标右边就是有多颗子树,我们要求有多颗子树的情况。那么对于这个坐标,乘起来就是答案。关键是怎么求有一颗子树的情况呢?难道要先预处理一下?好吧我一开始就是这么想的,然后发现只能一边dp一边处理,那怎么处理呢?。。。这不就想到了吗,当时怎么就差了这一步呢。。。由于预处理太简单,直接放到转移方程里即可。


总的来说就是自己思路太死板,总觉得得从某类有相同特性的状态转移过来。但是再风骚的办法也是从基础的办法通过分析,思考,总结,优化得到的,而不是凭空乱想出来的。今后自己在状态转移上可以灵活一点,但不要乱想。

0 0
原创粉丝点击