LeetCode 题解工作台

多边形三角剖分的最低得分

你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是按 顺时针顺序 第 i 个顶点的值。 假设将多边形 剖分 为 n - 2 个三角形。对于每个三角形,该三角形的值是顶点标记的 乘积 ,三角剖分的分数是进行三角剖分后所有 n - 2 个三角…

category

2

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 状态·转移·动态规划

bolt

答案摘要

我们设计一个函数 $\text{dfs}(i, j)$,表示将多边形的顶点 到 进行三角剖分后的最低分数。那么答案就是 $\text{dfs}(0, n - 1)$。 函数 $\text{dfs}(i, j)$ 的计算过程如下:

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是按 顺时针顺序 i 个顶点的值。

假设将多边形 剖分 为 n - 2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 n - 2 个三角形的值之和。

返回 多边形进行三角剖分后可以得到的最低分
 

示例 1:

输入:values = [1,2,3]
输出:6
解释:多边形已经三角化,唯一三角形的分数为 6。

示例 2:

输入:values = [3,7,4,5]
输出:144
解释:有两种三角剖分,可能得分分别为:3*7*5 + 4*5*7 = 245,或 3*4*5 + 3*4*7 = 144。最低分数为 144。

示例 3:

输入:values = [1,3,1,4,1,5]
输出:13
解释:最低分数三角剖分的得分情况为 1*1*3 + 1*1*4 + 1*1*5 + 1*1*1 = 13。

 

提示:

  • n == values.length
  • 3 <= n <= 50
  • 1 <= values[i] <= 100
lightbulb

解题思路

方法一:记忆化搜索

我们设计一个函数 dfs(i,j)\text{dfs}(i, j),表示将多边形的顶点 iijj 进行三角剖分后的最低分数。那么答案就是 dfs(0,n1)\text{dfs}(0, n - 1)

函数 dfs(i,j)\text{dfs}(i, j) 的计算过程如下:

如果 i+1=ji + 1 = j,说明多边形只有两个顶点,无法进行三角剖分,返回 00

否则,我们枚举 iijj 之间的一个顶点 kk,即 i<k<ji \lt k \lt j,将多边形的顶点 iijj 进行三角剖分,可以分为两个子问题:将多边形的顶点 iikk 进行三角剖分,以及将多边形的顶点 kkjj 进行三角剖分。这两个子问题的最低分数分别为 dfs(i,k)\text{dfs}(i, k)dfs(k,j)\text{dfs}(k, j),而顶点 ii, jjkk 构成的三角形的分数为 values[i]×values[k]×values[j]\text{values}[i] \times \text{values}[k] \times \text{values}[j]。那么,此次三角剖分的最低分数为 dfs(i,k)+dfs(k,j)+values[i]×values[k]×values[j]\text{dfs}(i, k) + \text{dfs}(k, j) + \text{values}[i] \times \text{values}[k] \times \text{values}[j],我们取所有可能的最小值,即为 dfs(i,j)\text{dfs}(i, j) 的值。

为了避免重复计算,我们可以使用记忆化搜索,即使用哈希表或者数组来存储已经计算过的函数值。

最后,我们返回 dfs(0,n1)\text{dfs}(0, n - 1) 即可。

时间复杂度 O(n3)O(n^3),空间复杂度 O(n2)O(n^2)。其中 nn 为多边形的顶点数。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution:
    def minScoreTriangulation(self, values: List[int]) -> int:
        @cache
        def dfs(i: int, j: int) -> int:
            if i + 1 == j:
                return 0
            return min(
                dfs(i, k) + dfs(k, j) + values[i] * values[k] * values[j]
                for k in range(i + 1, j)
            )

        return dfs(0, len(values) - 1)
speed

复杂度分析

指标
时间complexity is O(n^3) because each of the O(n^2) subproblems checks O(n) possible k splits. Space complexity is O(n^2) for storing the DP table.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Focus on state transition dynamic programming for polygon subproblems.

  • question_mark

    Check whether the DP correctly handles all subpolygon combinations.

  • question_mark

    Expect reasoning about triangle vertex products and minimal sums.

warning

常见陷阱

外企场景
  • error

    Forgetting that a triangle must use original polygon vertices only.

  • error

    Misindexing DP ranges or skipping subpolygons of length 3.

  • error

    Not considering all possible k splits between i and j, missing minimal scores.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Compute maximal score instead of minimal by adjusting DP comparisons.

  • arrow_right_alt

    Allow polygons with negative vertex values affecting triangle weight.

  • arrow_right_alt

    Optimize for memory by using a rolling DP table if needed.

help

常见问题

外企场景

多边形三角剖分的最低得分题解:状态·转移·动态规划 | LeetCode #1039 中等