bzoj3229 石子合并

来源:互联网 发布:雷蛇云驱动mac版怎么用 编辑:程序博客网 时间:2024/04/30 19:55

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  N<=200

阶段:合并长度

状态: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[k1]a[k+1]k,然后合并a[k1],a[k]

2.从当前位置开始向左找第一个a[j]>a[k1]+a[k]j,把合并后的值插到j的后面

3.一直这样重复下去直到剩下一堆



1 0
原创粉丝点击