题目:
你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是第 i 个顶点的值(即 顺时针顺序 )。
假设将多边形 剖分 为 n - 2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 n - 2 个三角形的值之和。
返回 多边形进行三角剖分后可以得到的最低分 。
算法:
方法一:动态规划 定义状态方程dp[i][j]意义为取三个点i,j,m(取值范围[i+1,j-1])构成三角形得最小面积,则dp[i][j] = min(ijm + dp[i][m] +dp[m][j]), m=[i+1,j-1],最后dp[0][n-1]就是所求结果
func minScoreTriangulation(values []int) int {
n := len(values)
dp := make([][]int, n)
for i := range dp {
dp[i] = make([]int, n)
}
for i := n - 3; i >= 0; i -- {
// 因为dp[i][j] =values[i] * values[j] * values[m] + dp[i][m] + dp[m][j]
// j要从最接近i的位置开始变大,这样dp[i][m],dp[m][j]就已经算好了。
for j := i + 2; j < n; j ++ {
for m := i + 1; m < j; m ++ {
if dp[i][j] == 0 {
dp[i][j] = values[i] * values[j] * values[m] + dp[i][m] + dp[m][j]
} else {
dp[i][j] = min(dp[i][j], values[i] * values[j] * values[m] + dp[i][m] + dp[m][j])
}
}
}
}
return dp[0][n-1]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}