【每日一题Day165】LC1039多边形三角剖分的最低得分 | 区间dp

简介: 【每日一题Day165】LC1039多边形三角剖分的最低得分 | 区间dp

多边形三角剖分的最低得分【LC1039】

你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是第 i 个顶点的值(即 顺时针顺序 )。

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

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

感觉dp要好好练习,稍微难点就写不出来,=(

递归
  • 思路:
    我们在一个多边形中选择第一条边,然后选择其他任意一个顶点,与该边的两个顶点相连,那么我们得到了一个三角形和两个小多边形,那么该多边形进行三角剖分后的最低分为这三个图形进行剖分后的最低分之和,因此我们可以使用递归/dp解决该题

因此可以定义递归函数dfs(i,j)表示从ij的多边形的最低得分

递归过程:枚举三角形的第三个顶点k,计算i到k的最低得分和kj的最低得分image.png

递归边界

dfs(i,i+1)=0    无法构成三角形

递归入口

dfs(0,n1)

实现

class Solution {
    private int[] v;
    private int[][] memo;
    public int minScoreTriangulation(int[] values) {
        v = values;
        int n = v.length;
        memo = new int[n][n];
        for (int i = 0; i < n; ++i)
            Arrays.fill(memo[i], -1); // -1 表示没有访问过
        return dfs(0, n - 1);
    }
    private int dfs(int i, int j) {
        if (i + 1 == j) return 0; // 只有两个点,无法组成三角形
        if (memo[i][j] != -1) return memo[i][j];
        int res = Integer.MAX_VALUE;
        for (int k = i + 1; k < j; ++k) // 枚举顶点 k
            res = Math.min(res, dfs(i, k) + dfs(k, j) + v[i] * v[j] * v[k]);
        return memo[i][j] = res;
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/minimum-score-triangulation-of-polygon/solutions/2203005/shi-pin-jiao-ni-yi-bu-bu-si-kao-dong-tai-aty6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度

  • 时间复杂度:O(n3)
  • 空间复杂度:O(n2)
动态规划

实现:外层逆序遍历i,内层正序遍历j和k

由于i<k,f[i]要能从f[k]转移过来,必须先计算出f[k],所以i要倒序枚举;

由于 j>k,f[i][j]要能从f[i][k]转移过来,必须先计算出f[i][k],所以j要正序枚举。

class Solution {
    public int minScoreTriangulation(int[] v) {
        int n = v.length;
        int[][] f = new int[n][n];
        for (int i = n - 3; i >= 0; --i)
            for (int j = i + 2; j < n; ++j) {
                f[i][j] = Integer.MAX_VALUE;
                for (int k = i + 1; k < j; ++k)
                    f[i][j] = Math.min(f[i][j], f[i][k] + f[k][j] + v[i] * v[j] * v[k]);
            }
        return f[0][n - 1];
    }
}
作者:灵茶山艾府
链接:https://leetcode.cn/problems/minimum-score-triangulation-of-polygon/solutions/2203005/shi-pin-jiao-ni-yi-bu-bu-si-kao-dong-tai-aty6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

复杂度

  • 时间复杂度:O(n3)
  • 空间复杂度:O(n2)

实现:从小到大枚举区间长度,然后枚举i,j=i+len-1,k[i+1,j1]

class Solution {
    public int minScoreTriangulation(int[] values) {
        int n = values.length;
        int[][] dp = new int[n][n]; 
        for (int len = 3; len <= n; len++){
            for (int i = 0; i + len - 1 < n; i++){
                int j = i + len - 1;
                dp[i][j] = Integer.MAX_VALUE;
                for (int k = i + 1; k < j; k++){
                    dp[i][j] = Math.min(dp[i][k] + dp[k][j] + values[i] * values[j] * values[k], dp[i][j]);
                }
            }
        }
        return dp[0][n - 1];
    }
}
目录
相关文章
|
1月前
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
34 0
|
1月前
|
算法
【每日一题Day363】LC275H 指数Ⅱ | 二分答案
【每日一题Day363】LC275H 指数Ⅱ | 二分答案
39 0
|
1月前
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
38 0
|
1月前
【每日一题Day342】LC2578最小和分割 | 贪心
【每日一题Day342】LC2578最小和分割 | 贪心
23 0
|
1月前
【每日一题Day141】LC2379得到 K 个黑块的最少涂色次数 | 滑动窗口
【每日一题Day141】LC2379得到 K 个黑块的最少涂色次数 | 滑动窗口
22 0
|
1月前
【每日一题Day297】LC1444切披萨的方案数 | 动态规划+二维前缀和
【每日一题Day297】LC1444切披萨的方案数 | 动态规划+二维前缀和
41 0
|
1月前
|
人工智能 BI
【每日一题Day354】LC2316统计无向图中无法互相到达点对数 | 并查集
【每日一题Day354】LC2316统计无向图中无法互相到达点对数 | 并查集
33 0
|
1月前
【每日一题Day167】LC1000合并石头的最低成本 | 区间dp
【每日一题Day167】LC1000合并石头的最低成本 | 区间dp
36 1
【每日一题Day167】LC1000合并石头的最低成本 | 区间dp
|
1月前
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
【每日一题Day350】LC2652倍数求和 | 数学+容斥原理
28 0
|
1月前
【每日一题Day360】LC1465切割后面积最大的蛋糕 | 贪心
【每日一题Day360】LC1465切割后面积最大的蛋糕 | 贪心
32 0