题目描述:
给定 N,想象一个凸 N 边多边形,其顶点按顺时针顺序依次标记为 A[0], A[i], …, A[N-1]。
假设您将多边形剖分为 N-2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 N-2 个三角形的值之和。
返回多边形进行三角剖分后可以得到的最低分。
示例 1:
输入:[1,2,3]
输出:6
解释:多边形已经三角化,唯一三角形的分数为 6。
没整出来,难受
看看别人写的代码:
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];
}