题目描述
- 有一个凸的 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] = 1e9for 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]
}