动态规划(Dynamic Programming),简称DP,是用于求解决策过程中的最优化数学方法,不仅用于编程领域,也用于管理学、经济学、生物学(具体这三个地方怎么用就不关我们事了)。作为NOIP竞赛的每年必考题型,动态规划是很重要的!!!

石子合并(NOI1995)(区间DP)

洛谷题目提交网址:石子合并

在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数记为该次合并的得分。试设计出一个算法,计算出将N堆石子合并成1堆的最小得分和最大得分。

输入第一行为 n(n≤100),表示有 n 堆石子。第二行为 n 个用空格隔开的整数,依次表示这 n 堆石子的石子数量。( ≤1000)

输出共 2 行;
第 1 行为将 n 堆石子合并成一堆的最小得分;
第 2 行为将 n 堆石子合并成一堆的最大得分。

3
1 2 3
9
11

一看到这题,我第一个想到的就是合并果子这道题。这两题的确很像,但是仔细看就发现他们存在的很明显的一个不同是:这题只能合并相邻两堆,而合并果子那题可以随便跳两堆合并。那么这题可以用贪心吗?显然有很多很多很多的反例,以求最小为例,比如有六堆石子,分别是3 4 6 5 4 2:

贪心:3 4 6 5 4 2
5 4 6 5 4 (+5)
9 6 5 4 (+9)
9 6 9 (+9)
15 9 (+15)
24 (+24)
Total:62
正解:3 4 6 5 4 2
7 6 5 4 2 (+7)
7 6 5 6 (+6)
7 6 11 (+11)
13 11 (+11)
24 (+24)
Total:59

所以贪心的方法肯定是不行的。再回来看看这题,发现首先决策不是按照一堆一堆来的,也就是说没法刷线性的DP;一个决策可以划分成很多子决策(也就是说所有的合并可以是1~i的合并得分+i+1~n的合并得分),那么不显然是区间DP嘛!

首先处理环的问题。一般处理环的问题的方法就是:复制一份,放到序列尾,这样就把环变成长度为原来两倍的链了。例如:

环:1 2 3 4
链:1 2 3 4 1 2 3 4

接下来,DP正式部分:定义F[i][j]为从i到j一段石子合并的最优解。那么自然会想到在i~j-1之间枚举k(为什么是j-1不是j?看转移方程就知道了),为了方便我们先造出前缀和sum,转移方程:

F[i][j]=max/min(F[i][k],F[k+1][j])+sum[j]-sum[i-1];

复杂度:O(N³)。

算是挺简单的一题。