首页 > 其他分享 >1039. 多边形三角剖分的最低得分

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

时间:2024-04-10 11:25:44浏览次数:30  
标签:多边形 剖分 int res memo dfs 1039 values return

题目链接:

image
image
image

实现一、记忆化搜索

class Solution {
public:
    int minScoreTriangulation(vector<int>& values) {
        int n = values.size();
        int memo[n][n];
        memset(memo, -1, sizeof memo);// -1 表示还没有计算过
        function<int(int, int)> dfs = [&] (int i, int j) -> int {
            if (j == i + 1) return 0;// 只有两个点,无法组成三角形
            int &res = memo[i][j];// 注意这里是引用,下面会直接修改 memo[i][j]
            if (res != -1) return res;
            res = 0x3f3f3f3f;
            for (int k = i + 1; k < j; k++) {
                res = min(res, dfs(i, k) + dfs(k, j) + values[i] * values[k] * values[j]);
            }
            return res;
        };
        return dfs(0, n - 1);
    }
};

实现二、递推

由于 \(i < k\), \(f[i]\) 要从 \(f[k]\) 转移过来必须先计算出 \(f[k]\),因此 \(i\) 需要倒序枚举
由于 \(j>k\),\(f[i][j]\) 要从 \(f[i][k]\) 转移过来必须先计算出 \(f[i][k]\),所以 \(j\) 需要正序枚举

此外,因为 \(j\) 至少比 \(i\) 大 \(2\),即 \(j\) 从 \(i+2\) 开始枚举,为了确保 \(j\) 不越界,则 \(i\) 应该从 \(n-3\) 开始倒序枚举。

class Solution {
public:
    static const int N = 55;
    int f[N][N];
    int minScoreTriangulation(vector<int>& values) {
        int n = values.size();
        memset(f, 0, sizeof f);
        for (int i = n - 3; i >= 0; i--) {
            for (int j = i + 2; j < n; j++) {
                f[i][j] = 0x3f3f3f3f;//确定i和j的取值后即将f[i][j]初始化为正无穷,依靠k来转移状态。
                for (int k = i + 1; k <= j - 1; k++) {
                    f[i][j] = min(f[i][j], f[i][k] + f[k][j] + values[i]*values[k]*values[j]);  
                }
            }
        }
        return f[0][n - 1];
    }
};
参考资料:区间 DP:最长回文子序列

标签:多边形,剖分,int,res,memo,dfs,1039,values,return
From: https://www.cnblogs.com/pangyou3s/p/18125643

相关文章

  • 重链剖分学习笔记
    Part.1引入重链剖分是一种用于解决树上的路径查询和修改问题的算法,他能将\(O(n)\)级别的操作转换为\(O(\logn)\)的级别,可以说十分常用。本文将带你深入解析这个算法。Part.2概念和思路在讲解本算法之前,我们先引入一些概念:轻重儿子:对于一个树上的节点\(u\),其儿子中子......
  • 在线CAD二次开发教程-实现圆转多边形功能的方法
    前言在线CADSDK的集成过程中,甲方客户可能有实现圆转多边形功能的需求,作为开发者如何利用WEBCADSDK展现此功能效果呢?本章节我们重点讲述一下。环境搭建1.搭建绘图环境,创建一个mxcad项目,具体操作请参考[mxcad|快速入门]。2.在项目中添加命令行,实现功能的动态交互功能,具体......
  • 树链剖分
    前言打算好好写一篇文章。至于为什么选了树剖这个主题,一是因为不久前学了长剖求树上k级祖先,二是因为重剖是我进提前批以来第一个学习到的树上算法,再加上有学弟写的超级详细的树剖学习笔记,也会使我写起来比较轻松一点。同时也可以熟悉一下TikZ这个宏包,它的功能实在是太多了,......
  • P8025 【树链剖分求祖先】
    P8025【树链剖分求祖先】这题的题意简单,简单分类讨论一下这里就不赘述了。最后题目就简化成求一个点的\(k\)级祖先。开始会的解法是倍增,但是常数过高被卡了。常数更优秀的做法是树剖,每一次跳树链,最后可能有一条链太长只能跳一部分,这是因为树链剖分的\(dfn\)序是有序的,即每......
  • P3384 【模板】重链剖分/树链剖分
    原题链接题解dalao‘sblog我自己的认识请看代码区code#include<bits/stdc++.h>usingnamespacestd;intn,Q,root,mod;intbigson[100005];//和自己在同一条链上的儿子节点vector<int>G[100005];intsizes[100005];//主要是为了求子树大小,经过验证选择哪一个儿子节点......
  • 树链剖分
    重链剖分【模板】重链剖分/树链剖分upd:每条重链必定由轻儿子开始,不同重链间必定由轻边连接,重链之内必定是重边。如果只有一次询问的话显然可以树上差分来解决,现在考虑多组询问。处理fa[i]dep[i]便于询问。处理size[i]son[i]top[i]idx[i]f[i]便于树剖。明确一下树剖......
  • Vue+OpenLayers7入门到实战:OpenLayers涂鸦手绘线条、圆形和多边形,涂鸦线条自动收尾连
    返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战前言本章介绍如何使用OpenLayers7在地图上进行绘制图形的功能,上一章中《Vue+OpenLayers7入门到实战:OpenLayers图形绘制功能,OpenLayers实现在地图上绘制线段、圆形和多边形》我们已经讲过多种图形的绘制,本章主要......
  • 多边形边界扩大算法 基于MATLAB
    首先,通过定义多边形的顶点坐标(在paths、paths1和paths2变量中)和外延大小(extra和extra2变量),确定多边形的形状和外延量。对于每个多边形:使用迭代的方式遍历多边形的每个顶点。对于每个顶点,计算与相邻边的单位向量,并根据指定的外延大小计算扩展向量的长度。使用单位向量和......
  • YC262A [ 20240321 CQYC省选模拟赛 T1 ] 多边形(polygon)
    题意有一个由\(0/1\)组成的字符串\(S\)。给你\(m\)次操作。假如\(S_{u}=1\)且\(S_{v}=0\),则交换\(S_{u},S_{v}\)。假如对于所有的\(S\),使得最终字符串\(S'\)的所有\(1\)相邻。请输出\(1\)的个数为\([1,n]\)的\(S\)的方案数。答案对\(2\)取模。......
  • 【Emgu CV教程】10.4、轮廓之多边形近似拟合
    文章目录一、什么叫轮廓的多边形近似拟合二、轮廓的多边形近似拟合函数三、简单应用1.原始素材2.代码3.运行结果一、什么叫轮廓的多边形近似拟合轮廓一般都是光滑的曲线,多边形近似拟合的意思就是,利用少量的点组成的折线,近似逼近原始多边形,这样可以减少轮廓的点集数......