区间DP,1039. 多边形三角剖分的最低得分
LeetCode-1039. 多边形三角剖分的最低得分
区间DP的应用,参考视频
题目描述:
你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是第 i 个顶点的值(即 顺时针顺序 )。
假设将多边形 剖分 为 n - 2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 n - 2 个三角形的值之和。
返回 多边形进行三角剖分后可以得到的最低分 。
思路,凸的n边形最多就是划分成n-2个三角形,乍一看比较复杂,但应该是动态规划的问题,让所选的边使得总的值最小就可以了,首先关键是抽象出子问题:
- 先选择两个相邻的顶点i,j,这两个点一定是在划分后的一个三角形里的
- 第三个点是顺时针遍历选取的,选取到第三个k后,i,j,k组成一个三角形
- 选取好k后,问题转化成从i到k和从k到j两个多边形的最低分问题
- 递归思想即可处理,但是本题目递归会浪费大量重复时间,因此可以选取DFS递归记忆化搜索或者动态规划
动态规划代码如下:
推荐先搞清楚递归的写法,递归是从上到下的,然后动态规划就需要倒序。
class Solution {
public:
int minScoreTriangulation(vector<int>& values) {
int len = values.size();
vector<vector<int>> dp(len, vector<int>(len,0));
int minx = INT_MAX;
for(int i = len - 3; i >= 0; i--){
for(int j = i + 2; j < len; j++){
minx = INT_MAX;
for(int k = i + 1; k < j; k++){
minx = min(minx, dp[i][k] + dp[k][j] + values[i] * values[j] * values[k]);
}
dp[i][j] = minx;
}
}
return dp[0][len-1];
}
};