LZR第一篇文章
[Sdoi2008]石子合并
Describe
在一个操场上摆放着一排N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
试设计一个算法,计算出将N堆石子合并成一堆的最小得分。
Input
第一行是一个数N。
以下N行每行一个数A,表示石子数目。
Output
共一个数,即N堆石子合并成一堆的最小得分。
Sample Input
4
1
1
1
1
Sample Output
8
HINT
对于 100% 的数据,1≤N≤40000
对于 100% 的数据,1≤A≤200
第一次接触这道题是区间Dp
阶段:合并长度
状态:f[j][p] 表示从第j堆到第p堆合并能够取到的最小值(最大值)
方程:f[j][p] = min(或max)(f[j][k] , f[k + 1][p]) + b[p] - b[j - 1];
那么复杂度是O(n^3)显然是承受不了的
那么用到一种新的算法GarsiaWachs算法。
流程是这样的:
【假设
a[0]=a[n+1]=inf
】
1.从序列的左端开始找第一个
a[k−1]≤a[k+1]
的
k
,然后合并
a[k−1],a[k]
2.从当前位置开始向左找第一个 a[j]>a[k−1]+a[k] 的 j ,把合并后的值插到 j 的后面
3.一直这样重复下去直到剩下一堆