跳到主要内容

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

链接:1039.多边形三角剖分的最低得分
难度:Medium
标签:数组、动态规划
简介:假设将多边形 剖分 为 n - 2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 n - 2 个三角形的值之和。返回 多边形进行三角剖分后可以得到的最低分 。

题解 1 - cpp

  • 编辑时间:2023-04-02
  • 执行用时:56ms
  • 内存消耗:9.4MB
  • 编程语言:cpp
  • 解法介绍:dp[i][j]表示从第i个点到第j个点能组成的三角形最小值,每次从中选一个点,把这一段分成三部分进行递归。
class Solution {
public:
int minScoreTriangulation(vector<int>& values) {
unordered_map<int, unordered_map<int, int>> m;
int n = values.size();
function<int(int, int)> dfs = [&](int start, int end) {
if (start + 2 > end) return 0;
else if (start + 2 == end) return values[start] * values[start + 1] * values[end];
else if (m.count(start) && m[start].count(end)) return m[start][end];
else {
int s = INT_MAX;
for (int i = start + 1; i < end; i++) {
s = min(s, values[start] * values[end] * values[i] + dfs(start, i) + dfs(i, end));
}
return m[start][end] = s;
}
};
return dfs(0, n - 1);
}
};

题解 2 - python

  • 编辑时间:2023-04-02
  • 执行用时:128ms
  • 内存消耗:15.5MB
  • 编程语言:python
  • 解法介绍:同上。
class Solution:
def minScoreTriangulation(self, values: List[int]) -> int:
n = len(values)

@cache
def dfs(start: int, end: int):
if start + 2 > end:
return 0
elif start + 2 == end:
return values[start] * values[start + 1] * values[end]
else:
s = 0x7fffffff
for i in range(start + 1, end):
s = min(s, values[start] * values[end] * values[i] + dfs(start, i) + dfs(i, end))
return s
return dfs(0, n-1)

题解 3 - rust

  • 编辑时间:2023-04-02
  • 执行用时:36ms
  • 内存消耗:2.1MB
  • 编程语言:rust
  • 解法介绍:同上。
impl Solution {
pub fn min_score_triangulation(values: Vec<i32>) -> i32 {
use std::collections::HashMap;
let mut m: HashMap<usize, HashMap<usize, i32>> = HashMap::new();
let n = values.len();
fn dfs(
m: &mut HashMap<usize, HashMap<usize, i32>>,
values: &Vec<i32>,
n: usize,
start: usize,
end: usize,
) -> i32 {
if start + 2 > end {
0
} else if start + 2 == end {
values[start] * values[start + 1] * values[end]
} else if m.contains_key(&start) && m.get(&start).unwrap().contains_key(&end) {
*m.get(&start).unwrap().get(&end).unwrap()
} else {
let mut s = i32::MAX;
for i in start + 1..end {
s = s.min(
values[start] * values[end] * values[i]
+ dfs(m, values, n, start, i)
+ dfs(m, values, n, i, end),
)
}
m.entry(start).or_insert(HashMap::new()).insert(end, s);
s
}
}
dfs(&mut m, &values, n, 0, n - 1)
}
}