三、多边形三角剖分的最低得分(Weekly Contest 135)

题目描述:
给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], …, A[N-1]。

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

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

示例 1:

输入:[1,2,3]
输出:6
解释:多边形已经三角化,唯一三角形的分数为 6。
三、多边形三角剖分的最低得分(Weekly Contest 135)_第1张图片

没整出来,难受
看看别人写的代码:

class Solution {
    public int minScoreTriangulation(int[] A) {
        final int alen = A.length;
        int[][] min = new int[alen][alen];
        for (int indexDiff = 2; indexDiff < alen; indexDiff++) {
            for (int start = 0; start < alen; start++) {
                final int end = (start + indexDiff) % alen;
                final int subMul = A[start] * A[end];
                min[start][end] = Integer.MAX_VALUE;
                for (int mid = (start + 1) % alen; mid != end; mid = (mid + 1) % alen) {
                    int now = subMul * A[mid] + min[start][mid] + min[mid][end];
                    if (min[start][end] > now) {
                        min[start][end] = now;
                    }
                }
            }
        }
        return min[0][A.length - 1];
    }
}

这个代码可能更好理解,自己尝试实现了一遍

//	使用动态规划,dp[i][j]表示的是连接i j点时的最小乘积
	public int minScoreTriangulation(int[] A) {
        int len = A.length;
        
        int dp[][] = new int[len][len];
        for (int d = 2; d < len; d++) {
			for (int i = 0; i + d < len; i++) {
				int j = i + d;
				dp[i][j] = Integer.MAX_VALUE;
				for (int k = i + 1; k < j; k++) {
					dp[i][j] = Math.min(dp[i][j], dp[i][k] + dp[k][j] + A[i] * A[k] * A[j]);
				}
			}
		}
      return dp[0][len - 1];
    }

三、多边形三角剖分的最低得分(Weekly Contest 135)_第2张图片

你可能感兴趣的:(竞赛)