#qJDPybttg050101. 1569:【 例 1】石子合并
1569:【 例 1】石子合并
好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
将 堆石子绕圆形操场排放,现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分。
请编写一个程序,读入堆数 及每堆的石子数,并进行如下计算:
- 选择一种合并石子的方案,使得做 次合并得分总和 最大;
- 选择一种合并石子的方案,使得做 次合并得分总和 最小。
输入格式
输入第一行一个整数 ,表示有 堆石子。
第二行 个整数,表示每堆石子的数量。
输出格式
输出共两行:
- 第一行为合并得分总和最小值;
- 第二行为合并得分总和最大值。
样例
样例输入
4
4 5 9 4
样例输出
43
54
样例解释
石子堆成环形,初始:。
环形合并问题,可以破环成链,即将数组复制一份接在后面:,然后对长度为 的链做区间 DP。
设 表示合并第 堆到第 堆的最小得分, 表示最大得分。
-
最小得分:
$$dp_{\min}[i][j] = \min_{i \le k < j} \{ dp_{\min}[i][k] + dp_{\min}[k+1][j] + \text{sum}(i,j) \}$$
枚举 之间最后一步合并的分界点 :其中 是第 堆到第 堆石子总数。
经过计算,最小总得分为 。
-
最大得分:
$$dp_{\max}[i][j] = \max_{i \le k < j} \{ dp_{\max}[i][k] + dp_{\max}[k+1][j] + \text{sum}(i,j) \}$$
公式类似,取最大值:经过计算,最大总得分为 。
数据范围
对于 的数据,。
时空限制
- 时间:
- 内存:
提示
这是经典的 环形石子合并 问题,可用 区间 DP 解决。
方法:
- 破环成链:将长度为 的环形数组复制一份接在后面,得到长度为 的数组 ;
- 计算前缀和 表示 的和,则 ;
- 设 和 分别为合并 的最小和最大得分;
- 初始化 ;
- 枚举长度 从 到 ,枚举起点 ,终点 ,枚举分界点 进行状态转移;
- 最终答案为:
- 最小值:
- 最大值:
时间复杂度 ,在 时可行。