#sBXDPlydlt50x5B03. 一个古老的石头游戏 An old Stone Game
一个古老的石头游戏 An old Stone Game
好的,这是整理后的完整题面,包含样例解释,格式清晰适合上传:
题目描述
有一个古老的石头游戏。
开始时, 堆石头排成一排。
游戏目标是将所有石头合并成一堆,规则如下:
- 每一步可以将两堆相邻的石头合并成一堆新石头堆。
- 每次合并的得分等于新堆中的石头数量。
你需要写一个程序,计算合并所有石头的最小总得分。
输入格式
输入包含多组测试数据。
- 每组数据第一行是一个整数 。
- 第二行包含 个整数,表示每堆石头的数量。
- 当输入一行只有一个
0时,表示输入终止。
输出格式
对于每组测试数据,输出一行,表示最小总得分。
数据保证结果不超过 。
数据范围
每堆石头的数量是正整数,总和不超过 。
输入样例
1
100
3
3 4 3
4
1 1 1 1
0
输出样例
0
17
8
样例解释
第一组数据
,只有一堆石头,不需要合并,总得分为 0。
输出 0。
第二组数据
,石头数量分别为 。
最少得分的合并顺序:
- 先合并 和 ,得到 ,得分 ;堆变为 。
- 再合并 和 ,得到 ,得分 。
总得分 。
其他顺序可能会得到更大的得分,比如:
- 先合并 和 得 ,得分 ;堆变为 。
- 再合并 和 得 ,得分 。总得分也是 。
实际上对于 ,最小得分就是 17。
输出 17。
第三组数据
,每堆 个石头,石头数组 。
最少得分的合并顺序(类似哈夫曼合并):
- 合并前两个 ,得 ,得分 ;堆变为 。
- 合并后两个 ,得 ,得分 ;堆变为 。
- 合并两个 ,得 ,得分 。
总得分 。
输出 8。
注意:由于 可能很大(),不能使用 的区间 DP,需要更高效的算法(如 Garsia-Wachs 算法)来解决此题。