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

127 阅读1分钟

题目:
你有一个凸的 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
}