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

题目描述

  • 有一个凸的 n 边形,其每个顶点都有一个整数值
  • 将其剖分为 n-2 个三角形
  • 每个三角形的值都是其三个顶点值的乘积
  • 返回剖分后可以得到的最低分

示例

1039-example-02

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

题解

  • 思路
    • 是道经典题,但若是第一次见,那就是“寄”
    • 固定一边,比如 "i<->j",三角形的第三个顶点为 i+1, i+2, ..., j-1 中的某一点
    • 若三角形固定,则其左右(若有)必有最小值,递归地求就行
    • "i,j" 是 n^2 的循环,k 从 i+1, ..., j-1 是 n,所以时间复杂度为 O(n^3)
    • 怎么想到的?我也想问~
func minScoreTriangulation(values []int) int {
    n := len(values)
    f := make([][]int, n)
    for i := 0; i < n; i ++ { f[i] = make([]int, n) }

    for size := 3; size <= n; size ++ {
        for i := 0; i + size - 1 < n; i ++ {
            j := i + size - 1;
            if size == 3 {
                f[i][j] = values[i] * values[i + 1] * values[j]
            } else {
                f[i][j] = 1e9
                for k := i + 1; k < j; k ++ {
                    f[i][j] = min(f[i][j], f[i][k] + f[k][j] +
                                  values[i] * values[j] * values[k])
                }
            }
        }
    }
    return f[0][n - 1]
}
posted @ 2025-09-28 22:21  余越  阅读(12)  评论(0)    收藏  举报