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.  重复第一步。

posted @ 2020-09-07 21:30  zmachine  阅读(211)  评论(0编辑  收藏  举报