好的,我将这道题整理为清晰的题面格式,并补充样例解释、数据范围与时空限制:
题目描述
给定一个具有 N 个顶点的凸多边形,将顶点从 1 至 N 标号,每个顶点的权值都是一个正整数。将这个凸多边形划分成 N−2 个互不相交的三角形,试求这些三角形顶点的权值乘积和至少为多少。
例如,一个五边形划分为 3 个三角形,每个三角形的权值乘积为三个顶点权值的乘积,求所有三角形乘积之和的最小值。
输入格式
输入第一行为顶点数 N。
第二行包含 N 个正整数,依次表示顶点 1 到顶点 N 的权值。
输出格式
输出仅一行,为一个整数,表示这些三角形顶点的权值乘积和的最小值。
注意:答案可能非常大,需要使用高精度(如 Python 的大整数或 C++ 的高精度类)。
样例
样例输入
5
121 122 123 245 231
样例输出
12214884
样例解释
N=5,顶点权值分别为 121,122,123,245,231。
我们要将五边形划分成 3 个三角形,使三角形顶点权值乘积之和最小。
一种最优划分:连接顶点 1−3、1−4,形成三角形 (1,2,3)、(1,3,4)、(1,4,5),计算:
- 三角形 (1,2,3):121×122×123=1814526
- 三角形 (1,3,4):121×123×245=3646335
- 三角形 (1,4,5):121×245×231=6844995
总和:1814526+3646335+6844995=12305856,但这不是最小,实际最小是 12214884(对应另一种划分)。
另一最优划分:连接 1−3、3−5,形成三角形 (1,2,3)、(1,3,5)、(3,4,5):
- (1,2,3):121×122×123=1814526
- (1,3,5):121×123×231=3437973
- (3,4,5):123×245×231=6962385
总和 1814526+3437973+6962385=12214884。
数据范围
对于 100% 的数据:
- N≤50
- 每个顶点权值 <109
时空限制
- 时间:1000 ms
- 内存:524288 KB
提示
此题为 凸多边形最优三角剖分 问题,可用 区间 DP 解决。
设 dp[i][j] 表示从顶点 i 到顶点 j(按顺序编号)组成的凸多边形的最优三角剖分的最小乘积和。
其中顶点按顺时针或逆时针编号,i<j,且多边形至少要有三个顶点。
状态转移方程:
$$dp[i][j] = \min_{i < k < j} \{ dp[i][k] + dp[k][j] + w[i] \times w[k] \times w[j] \}$$
这里 w[i] 表示顶点 i 的权值,三角形 (i,k,j) 的权值乘积为 w[i]×w[k]×w[j]。
初始化:dp[i][i+1]=0(两个顶点不能形成三角形,乘积和为 0)。
最终答案为 dp[1][N]。
由于 N≤50,乘积可能极大(每个权值可达 109,三个乘起来可达 1027,再乘以 N 次更可能极大),必须使用高精度运算(如 Python 的 int 或 C++ 的高精度类)。