多边形三角剖分的最小乘积和问题
题目描述
给定一个凸多边形,其顶点按顺时针顺序标记为 v[0], v[1], …, v[n-1],并且每个顶点 v[i] 有一个整数权重 w[i]。对多边形进行三角剖分(即通过添加 n-3 条互不相交的对角线将多边形划分成 n-2 个三角形)。每个三角形的“得分”定义为它的三个顶点权重之和。三角剖分的“总得分”是所有三角形得分之和。要求找出一种三角剖分,使得总得分最小,并返回这个最小总得分。
例如,对于一个五边形,顶点权重为 [1, 2, 3, 4, 5],一种可能的三角剖分由对角线 (0,2) 和 (0,3) 组成,形成三角形 (0,1,2)、(0,2,3) 和 (0,3,4)。三角形得分分别为 (1+2+3)=6、(1+3+4)=8、(1+4+5)=10,总得分为 24。但可能存在其他剖分得到更小的总得分。
解题思路
这是一个典型的区间动态规划问题。我们可以将多边形顶点视为一个环,但通常在 DP 中我们固定一条边作为区间起点,将环转化为线性问题(因为三角剖分中必有一条边属于某个三角形,我们可以固定这条边来简化)。定义状态 dp[i][j] 表示由顶点 i, i+1, …, j 按顺序组成的凸多边形(共 j-i+1 个顶点)进行三角剖分后的最小总得分(其中 i < j)。注意:这里 i 到 j 是连续的一段顶点,并且我们视多边形的一条边 (i, j) 已经存在(即这部分多边形是原多边形的一个连续片段)。
状态转移
考虑区间 [i, j],如果 j - i < 2,即顶点数少于 3,无法形成三角形,那么 dp[i][j] = 0(因为没有三角形,得分为 0)。
对于 j - i >= 2,即至少 3 个顶点,我们选择其中一个顶点 k(i < k < j),将多边形 [i, j] 划分为三部分:
- 三角形
(i, k, j)。 - 子多边形
[i, k](顶点 i 到 k)。 - 子多边形
[k, j](顶点 k 到 j)。
这样,多边形 [i, j] 的三角剖分可以由这两个子多边形的三角剖分加上三角形 (i, k, j) 组成。因此,状态转移方程为:
dp[i][j] = min_{k从i+1到j-1} ( dp[i][k] + dp[k][j] + w[i] + w[k] + w[j] )
最终答案
由于多边形是环形的,我们可以固定顶点 0 和 n-1 之间的边作为初始边,那么答案就是 dp[0][n-1](因为 0 到 n-1 包含了所有 n 个顶点,并且边 (0, n-1) 是多边形的一条边)。
详细计算步骤(以权重 w = [1, 2, 3, 4, 5] 为例)
- 初始化:
dp[i][j] = 0对于所有j-i < 2(即区间长度小于 3)。 - 计算区间长度
len从 2 到 n-1(因为顶点索引从 0 到 n-1,len表示区间内顶点数减 1,即j-i的值)。- 当
len=2时,区间包含 3 个顶点(例如[0,2]包含顶点 0,1,2)。此时只能形成一个三角形,dp[0][2] = w[0]+w[1]+w[2] = 1+2+3=6。 - 当
len=3时,区间包含 4 个顶点(例如[0,3]包含顶点 0,1,2,3)。我们需要枚举中间点k=1或k=2:
对于k=1:dp[0][1] + dp[1][3] + w[0]+w[1]+w[3] = 0 + (w[1]+w[2]+w[3]) + (1+2+4) = (2+3+4) + 7 = 9+7=16。
对于k=2:dp[0][2] + dp[2][3] + w[0]+w[2]+w[3] = (1+2+3) + 0 + (1+3+4) = 6+8=14。
取最小值,所以dp[0][3] = 14。 - 当
len=4时,区间包含 5 个顶点(即整个五边形[0,4])。枚举k=1,2,3:
对于k=1:dp[0][1] + dp[1][4] + w[0]+w[1]+w[4] = 0 + dp[1][4] + (1+2+5)。
需先计算dp[1][4](顶点 1,2,3,4)。类似地,dp[1][4]通过枚举k=2,3得到:
当k=2:dp[1][2] + dp[2][4] + w[1]+w[2]+w[4] = 0 + (w[2]+w[3]+w[4]) + (2+3+5) = (3+4+5)+10=12+10=22。
当k=3:dp[1][3] + dp[3][4] + w[1]+w[3]+w[4] = (w[1]+w[2]+w[3]) + 0 + (2+4+5) = 9+11=20。
所以dp[1][4] = 20。
于是k=1对应值:0 + 20 + 8 = 28。
对于k=2:dp[0][2] + dp[2][4] + w[0]+w[2]+w[4] = 6 + (w[2]+w[3]+w[4]) + (1+3+5) = 6 + 12 + 9 = 27。
对于k=3:dp[0][3] + dp[3][4] + w[0]+w[3]+w[4] = 14 + 0 + (1+4+5) = 14+10=24。
取最小值,所以dp[0][4] = 24。
- 当
因此,最小总得分为 24。
复杂度分析
状态数 O(n²),每个状态需要枚举中间点 k,转移复杂度 O(n),总时间复杂度 O(n³)。空间复杂度 O(n²)。可以通过递推区间长度由小到大来计算 DP 表。