题目描述
有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
输入
有多组测试数据,输入到文件结束。
每组测试数据第一行有一个整数n,表示有n堆石子。
接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开。
输出
输出总代价的最小值,占单独的一行。
样例输入
3
1 2 3
7
13 7 8 16 21 4 18
样例输出
9
239
题目解析:
本次讲解是延续了上一期的博客,上一次我们主要是通过三层循环遍历求得合并代价的最小值,没有考虑时间复杂度,链接为https://blog.youkuaiyun.com/chenpeixing361/article/details/88720927。本次主要探讨的主题是如何对上次所写的代码进行优化,降低时间复杂度。上次的代码我们在函数中写了三层循环,第一层代表区间分割长度,第二层代表区间起始的坐标,第三层循环代表分割的位置,那么我们如何进行优化呢?
我们知道当a, b, c, d(a <= b < c <= d)当有cost[a][c] + cost[b][d] <= cost[a][d] + cost[b][c] 时,我们称其满足