#qJDPybttg050102. 1570:【例 2】能量项链

1570:【例 2】能量项链

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


题目描述

原题来自:NOIP 2006

在 Mars 星球上,每个 Mars 人都随身佩带着一串能量项链。在项链上有 NN 颗能量珠。能量珠是一颗有头标记和尾标记的珠子,这些标记对应着某个正整数。并且,对于相邻的两颗珠子,前一颗珠子的尾标记必定等于后一颗珠子的头标记。因为只有这样,通过吸盘——Mars 人吸收能量的器官的作用,这两颗珠子才能聚合成一颗珠子,同时释放出可被吸盘吸收的能量。

如果一颗能量珠头标记为 mm,尾标记为 rr,后一颗能量珠头标记为 rr,尾标记为 nn,则聚合后释放出 m×r×nm \times r \times n Mars 单位的能量,新珠子头标记为 mm,尾标记为 nn

当需要时,Mars 人就用吸盘夹住相邻的两颗珠子,通过聚合得到能量,直到项链上只剩下一颗珠子为止。显然,不同的聚合顺序得到的总能量是不一样的。请设计一个聚合顺序使得一串珠子聚合后释放出的总能量最大。

例如,设 N=4N=4,四颗珠子头标记与尾标记分别为 (2,3),(3,5),(5,10),(10,2)(2,3),(3,5),(5,10),(10,2)。我们用记号 \bigotimes 表示两颗珠子的聚合操作,(jk)(j \bigotimes k) 表示 j,kj,k 两颗珠子聚合后释放出的能量,则 4,14,1 两颗珠子聚合后所释放的能量为 (41)=10×2×3=60(4 \bigotimes 1) = 10 \times 2 \times 3 = 60,这一串项链可以得到最优值的一个聚合顺序所释放出的总能量为:

$$((4 \bigotimes 1) \bigotimes 2) \bigotimes 3 = 10 \times 2 \times 3 + 10 \times 3 \times 5 + 10 \times 5 \times 10 = 710$$

现在给你一串项链,项链上有 nn 颗珠子,相邻两颗珠子可以合并成一个,合并同时会放出一定的能量,不同珠子合并放出能量不相同,请问按怎样的次序合并才能使得释放的能量最多?


输入格式

第一行一个正整数 nn

第二行 nn 个不超过 10001000 的正整数,第 ii (1in)(1 \le i \le n) 个数为第 ii 颗珠子的头标记。
ini \neq n 时,第 ii 颗珠子的尾标记等于第 i+1i+1 颗珠子的头标记;当 i=ni = n 时,第 ii 颗珠子的尾标记等于第 11 颗珠子的头标记。

:珠子的顺序这样确定:将项链放在桌面上,不要出现交叉,随机指定一颗珠子为第一颗珠子,按顺时针确定其它珠子的顺序。


输出格式

输出只有一行,一个不超过 2.1×1092.1 \times 10^9 的正整数,表示最优聚合顺序所释放的能量。


样例

样例输入

4
2 3 5 10

样例输出

710

样例解释

珠子头标记分别为 [2,3,5,10][2,3,5,10],尾标记依次为 [3,5,10,2][3,5,10,2](因为第 4 颗珠子的尾标记等于第 1 颗的头标记 2)。

于是四颗珠子可表示为:(2,3), (3,5), (5,10), (10,2)(2,3),\ (3,5),\ (5,10),\ (10,2)

最优合并顺序是:
先合并珠子 4 和 1(即 (10,2)(10,2)(2,3)(2,3)):释放能量 10×2×3=6010 \times 2 \times 3 = 60,得到新珠子 (10,3)(10,3)
再合并新珠子 (10,3)(10,3) 和珠子 2 (3,5)(3,5):释放能量 10×3×5=15010 \times 3 \times 5 = 150,得到新珠子 (10,5)(10,5)
最后合并新珠子 (10,5)(10,5) 和珠子 3 (5,10)(5,10):释放能量 10×5×10=50010 \times 5 \times 10 = 500

总能量 60+150+500=71060 + 150 + 500 = 710


数据范围

对于 100%100\% 的数据,4n1004 \le n \le 100


时空限制

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

提示
此题是 环形 DP 问题,与环形石子合并类似,但转移方程略有不同。

破环成链:将长度为 nn 的头标记数组 a[1n]a[1 \dots n] 复制一遍接在后面,得到 a[12n]a[1 \dots 2n]

dp[i][j]dp[i][j] 表示合并区间 [i,j][i,j] 内的珠子所能得到的最大能量(区间长度至少为 2)。
则状态转移方程:

$$dp[i][j] = \max_{i \le k < j} \{ dp[i][k] + dp[k+1][j] + a[i] \times a[k+1] \times a[j+1] \}$$

注意这里 a[k+1]a[k+1] 是第 kk 颗珠子的尾标记(即 a[k+1]a[k+1] 是下一颗的头标记),a[j+1]a[j+1] 是第 jj 颗珠子的尾标记。

最终答案为:

max1indp[i][i+n1]\max_{1 \le i \le n} dp[i][i+n-1]

注意:dp[i][i]=0dp[i][i] = 0(单独一颗珠子无法合并释放能量),枚举长度从 22nn 进行 DP。