区间DP解析超详细版!!
在上章 背包 (<—点击传送)中我们讲到DP是一种记忆化搜索,需要状态的传递来达到更深层次的搜索。
价值与代价的组合嵌套成背包中状态,而区间DP
,则是需要子区间的更迭,环环相扣由子区间之间的组合来组成父区间的值,通过级级解决区间的合并问题来得出最优值。
1. 概念入门
第一次接触区间DP是在和学长闲聊时被考到的
当时的问题是:
在一个环形操场上放着若干堆石子,定义代价是相邻两堆石子合并时的重量和,求合成一堆时的最小代价。
当时第一反应是用孤儿贪心思想。众所周知,贪心是保证当前抉择最优却无法保证整体策略最优。
2. 线性石子归并
此题不适合入门学者,修改一下,线性石子归并(<—点击传送)
N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价。
给一个 5 堆的样例:8 4 6 3 5
运用贪心(每次合并最小代价和的两堆),算出结果62,最优解是60
放弃贪心我们来学习区间DP吧!
规定:Q( a , b )代表从第 a 堆到第 b 堆的区间内合并的最小代价值。
用逆推思想,假设自己是上帝,知道如何组合去做到最优解:合并的最后一定是两堆相合,设为 堆a 和 堆b,知晓最优的 a,b 就可以推出答案; 那么 堆a/堆b 也是两堆所和,设为 堆c和堆d/堆e和堆f,知晓…
发现问题开始递成一个个子问题,和DP思想逐渐吻合。
并且分区到最底层一定是 Q( n , n ), 即某一堆的石子量,是我们已知的条件。
大区间包含小区间,我们解决了小区间才能解决大区间。我们 跑遍一个区间的所有可能组合 ,
例如:Q( 1 , 5 ) = min { Q(1,1)+Q(2,5), Q(1,2)+Q(3,5), Q(1,3)+Q(4,5), Q(1,4)+Q(5,5) }
就可以取出这个区间的最优组合,知晓这个区间的最优解。
在 for 循环中的最外层放置L(length),使得小区间会在大区间之前被处理完
区间左端为 i ,右端