GarsiaWachs算法
在一个操场上摆放着一排 NN 堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的 22 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
试设计一个算法,计算出将 NN 堆石子合并成一堆的最小得分。
输入格式
第一行一个整数 NN。
接下来 NN 行,第 ii 行一个整数 a_iai,代表第 ii 堆石子的石子数。
输出格式
输出将所有石子合并为一堆的最小得分。
解题思路:
对于一堆石子(链式):
1. 从最左边开始向右走直到 stone[ k ] <= stone[ k + 2 ] 然后合并 stone[ k + 1 ] += stone[ k ];
2. 从k 往前走 直到 stone[ j ] > stone[ k ] + stone[ k + 1 ] 然后将新合并的数放在 j 后面
如果不存在这样的 j ,就放在最前面
3. 如果我们找不到这样的 k , 就合并最后的两个数即 stone[ n ] 和 stone[ n - 1 ] (显然这两个数是最小的)
4. 重复第一步。