#qJDPybttg050101. 1569:【 例 1】石子合并

1569:【 例 1】石子合并

好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:


题目描述

nn 堆石子绕圆形操场排放,现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分。

请编写一个程序,读入堆数 nn 及每堆的石子数,并进行如下计算:

  1. 选择一种合并石子的方案,使得做 n1n-1 次合并得分总和 最大
  2. 选择一种合并石子的方案,使得做 n1n-1 次合并得分总和 最小

输入格式

输入第一行一个整数 nn,表示有 nn 堆石子。

第二行 nn 个整数,表示每堆石子的数量。


输出格式

输出共两行:

  • 第一行为合并得分总和最小值;
  • 第二行为合并得分总和最大值。

样例

样例输入

4
4 5 9 4

样例输出

43
54

样例解释

石子堆成环形,初始:[4,5,9,4][4, 5, 9, 4]

环形合并问题,可以破环成链,即将数组复制一份接在后面:[4,5,9,4,4,5,9,4][4, 5, 9, 4, 4, 5, 9, 4],然后对长度为 2n2n 的链做区间 DP。

dpmin[i][j]dp_{\min}[i][j] 表示合并第 ii 堆到第 jj 堆的最小得分,dpmax[i][j]dp_{\max}[i][j] 表示最大得分。

  • 最小得分
    枚举 iji \to j 之间最后一步合并的分界点 kk

    $$dp_{\min}[i][j] = \min_{i \le k < j} \{ dp_{\min}[i][k] + dp_{\min}[k+1][j] + \text{sum}(i,j) \}$$

    其中 sum(i,j)\text{sum}(i,j) 是第 ii 堆到第 jj 堆石子总数。

    经过计算,最小总得分为 4343

  • 最大得分
    公式类似,取最大值:

    $$dp_{\max}[i][j] = \max_{i \le k < j} \{ dp_{\max}[i][k] + dp_{\max}[k+1][j] + \text{sum}(i,j) \}$$

    经过计算,最大总得分为 5454


数据范围

对于 100%100\% 的数据,1n2001 \le n \le 200


时空限制

  • 时间:1000 ms1000 \text{ ms}
  • 内存:524288 KB524288 \text{ KB}

提示
这是经典的 环形石子合并 问题,可用 区间 DP 解决。

方法:

  1. 破环成链:将长度为 nn 的环形数组复制一份接在后面,得到长度为 2n2n 的数组 a[12n]a[1 \dots 2n]
  2. 计算前缀和 sum[i]sum[i] 表示 a[1i]a[1 \dots i] 的和,则 sum(i,j)=sum[j]sum[i1]sum(i,j) = sum[j] - sum[i-1]
  3. fmin[i][j]f_{\min}[i][j]fmax[i][j]f_{\max}[i][j] 分别为合并 a[ij]a[i \dots j] 的最小和最大得分;
  4. 初始化 fmin[i][i]=fmax[i][i]=0f_{\min}[i][i] = f_{\max}[i][i] = 0
  5. 枚举长度 lenlen22nn,枚举起点 ii,终点 j=i+len1j = i + len - 1,枚举分界点 kk 进行状态转移;
  6. 最终答案为:
    • 最小值:min1infmin[i][i+n1]\min_{1 \le i \le n} f_{\min}[i][i+n-1]
    • 最大值:max1infmax[i][i+n1]\max_{1 \le i \le n} f_{\max}[i][i+n-1]

时间复杂度 O(n3)O(n^3),在 n200n \le 200 时可行。