#qJDPybttg050103. 1571:【例 3】凸多边形的划分

1571:【例 3】凸多边形的划分

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


题目描述

给定一个具有 NN 个顶点的凸多边形,将顶点从 11NN 标号,每个顶点的权值都是一个正整数。将这个凸多边形划分成 N2N-2 个互不相交的三角形,试求这些三角形顶点的权值乘积和至少为多少。

例如,一个五边形划分为 33 个三角形,每个三角形的权值乘积为三个顶点权值的乘积,求所有三角形乘积之和的最小值。


输入格式

输入第一行为顶点数 NN

第二行包含 NN 个正整数,依次表示顶点 11 到顶点 NN 的权值。


输出格式

输出仅一行,为一个整数,表示这些三角形顶点的权值乘积和的最小值。

注意:答案可能非常大,需要使用高精度(如 Python 的大整数或 C++ 的高精度类)。


样例

样例输入

5
121 122 123 245 231

样例输出

12214884

样例解释

N=5N=5,顶点权值分别为 121,122,123,245,231121, 122, 123, 245, 231

我们要将五边形划分成 33 个三角形,使三角形顶点权值乘积之和最小。

一种最优划分:连接顶点 131-3141-4,形成三角形 (1,2,3)(1,2,3)(1,3,4)(1,3,4)(1,4,5)(1,4,5),计算:

  • 三角形 (1,2,3)(1,2,3)121×122×123=1814526121 \times 122 \times 123 = 1814526
  • 三角形 (1,3,4)(1,3,4)121×123×245=3646335121 \times 123 \times 245 = 3646335
  • 三角形 (1,4,5)(1,4,5)121×245×231=6844995121 \times 245 \times 231 = 6844995

总和:1814526+3646335+6844995=123058561814526 + 3646335 + 6844995 = 12305856,但这不是最小,实际最小是 1221488412214884(对应另一种划分)。

另一最优划分:连接 131-3353-5,形成三角形 (1,2,3)(1,2,3)(1,3,5)(1,3,5)(3,4,5)(3,4,5)

  • (1,2,3)(1,2,3)121×122×123=1814526121\times 122\times 123 = 1814526
  • (1,3,5)(1,3,5)121×123×231=3437973121\times 123\times 231 = 3437973
  • (3,4,5)(3,4,5)123×245×231=6962385123\times 245\times 231 = 6962385

总和 1814526+3437973+6962385=122148841814526+3437973+6962385 = 12214884


数据范围

对于 100%100\% 的数据:

  • N50N \le 50
  • 每个顶点权值 <109< 10^9

时空限制

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

提示
此题为 凸多边形最优三角剖分 问题,可用 区间 DP 解决。

dp[i][j]dp[i][j] 表示从顶点 ii 到顶点 jj(按顺序编号)组成的凸多边形的最优三角剖分的最小乘积和。
其中顶点按顺时针或逆时针编号,i<ji < j,且多边形至少要有三个顶点。

状态转移方程:

$$dp[i][j] = \min_{i < k < j} \{ dp[i][k] + dp[k][j] + w[i] \times w[k] \times w[j] \}$$

这里 w[i]w[i] 表示顶点 ii 的权值,三角形 (i,k,j)(i,k,j) 的权值乘积为 w[i]×w[k]×w[j]w[i] \times w[k] \times w[j]

初始化:dp[i][i+1]=0dp[i][i+1] = 0(两个顶点不能形成三角形,乘积和为 0)。

最终答案为 dp[1][N]dp[1][N]

由于 N50N \le 50,乘积可能极大(每个权值可达 10910^9,三个乘起来可达 102710^{27},再乘以 NN 次更可能极大),必须使用高精度运算(如 Python 的 int 或 C++ 的高精度类)。