当前位置: 首页 > news >正文

LeetCode 1039.多边形三角剖分的最低得分:记忆化搜索(深度优先搜索)

【LetMeFly】1039.多边形三角剖分的最低得分:记忆化搜索(深度优先搜索)

力扣题目链接:https://leetcode.cn/problems/minimum-score-triangulation-of-polygon/

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

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

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

    示例 1:

    输入:values = [1,2,3]
    输出:6
    解释:多边形已经三角化,唯一三角形的分数为 6。
    

    示例 2:

    输入:values = [3,7,4,5]
    输出:144
    解释:有两种三角剖分,可能得分分别为:3*7*5 + 4*5*7 = 245,或 3*4*5 + 3*4*7 = 144。最低分数为 144。
    

    示例 3:

    输入:values = [1,3,1,4,1,5]
    输出:13
    解释:最低分数三角剖分的得分情况为 1*1*3 + 1*1*4 + 1*1*5 + 1*1*1 = 13。
    

     

    提示:

    • n == values.length
    • 3 <= n <= 50
    • 1 <= values[i] <= 100

    解题方法:DFS

    借一张@灵茶山艾府的图:

    5时示例图

    以边1-5为例,这条边最终一定在一个三角形中。在哪个三角形中呢?一共有图中这四种可能。我们分别枚举这4种可能就好了。

    具体来说,我们可以写一个函数dfs(i, j),代表从ij的凸多边形的最低得分,那么将点k作为边15所在三角形的另一个顶点的话,得到的总得分为dfs(i, k)+dfs(k, j) + i*j*k

    • 时间复杂度O(n3)O(n^3)O(n3)
    • 空间复杂度O(n2)O(n^2)O(n2)

    AC代码

    C++
    /** @Author: LetMeFly* @Date: 2025-09-29 18:44:48* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-10-01 20:38:27*/
    #if defined(_WIN32) || defined(__APPLE__)
    #include "_[1,2]toVector.h"
    #endifclass Solution {
    private:unordered_map<int, int> cache;vector<int> values;int n;int dfs(int i, int j) {if (j - i < 2) {return 0;}int key = i * n + j;if (cache.count(key)) {return cache[key];}if (j - i == 2) {return cache[key] = values[i] * values[i + 1] * values[i + 2];}int ans = 1000000000;/*0 1 2 3 -> 0 1 2 + 0 2 30   13   20 1 2 3 434        20      1(i,j,k) + dfs(i,k)+dfs(k,j)*/for (int k = i + 1; k < j; k++) {ans = min(ans, dfs(i, k) + dfs(k, j) + values[i] * values[k] * values[j]);}return cache[key] = ans;}
    public:int minScoreTriangulation(vector<int>& values) {this->values = move(values);n = this->values.size();return dfs(0, n - 1);}
    };#if defined(_WIN32) || defined(__APPLE__)
    /*
    [3,7,4,5]144
    */
    int main() {string s;while (cin >> s) {vector<int> v = stringToVector(s);Solution sol;cout << sol.minScoreTriangulation(v) << endl;}return 0;
    }
    #endif
    

    同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

    千篇源码题解已开源

    http://www.dtcms.com/a/430773.html

    相关文章:

  1. C# 循环
  2. leetcode 22 括号生成
  3. 从0死磕全栈之Next.js App Router 入门实战:5 分钟搭建一个待办事项(Todo List)应用
  4. Nature 正刊:美国麻省理工学院团队开发了多模态机器人平台加速多元素催化剂的发现与优化
  5. [Windows] 【2025.09.30更新】PotPlayer_ 64位Public版_v250909(1.7.22619)_精简绿化版
  6. 【Java ArrayList】底层方法的自我实现
  7. 安卓基础组件015--textinput
  8. YDWE编辑器系列教程三:触发编辑器
  9. [hpatch]差分算法学习笔记 -- lite解压
  10. 【langgraph】conda创建3.13环境并运行langgraph dev
  11. 免费企业建站模板wordpress媒体库一直加载
  12. 自己建设公司网站免费建站网站 seo
  13. web开发,在线%校园,论坛,社交管理%系统,基于html,css,python,django,mysql
  14. 基于开源AI智能名片链动2+1模式S2B2C商城小程序的引流爆款设计策略研究
  15. Stable Diffusion里面Cross-Attention设计:为啥Q来自图像/噪声,K和V来自文本
  16. 镇江网站关键字优化建立网站站点的过程中正确的是
  17. 深度学习第九章 卷积神经网络
  18. 【数据结构】堆、计数、桶、基数排序的实现
  19. 【数据结构】数据结构秘籍:如何衡量“查找”的快慢?ASL是关键!
  20. 1688网站入口学编程的正规学校培训机构
  21. Python 2025:嵌入式系统与物联网(IoT)开发新趋势
  22. 怎么看网站备案网店运营都要做什么
  23. 【数据结构与算法学习笔记】栈
  24. Java-Spring入门指南(十八)JSON字符串的解析与对象转换
  25. JavaScript 严格模式
  26. 数据时代的基石 —— 数据库的核心价值:MySQL 三大范式精讲
  27. **跨平台开发:发散创新,探索无界限**随着技术的飞速发展,跨平台开发已经成为软件开发的必然趋势
  28. 2025年中小工程企业成本管理新突破:如何选对管理软件?
  29. JVM初始堆大小和最大堆大小多少合适?
  30. 网站汉英结合的怎么做织梦欧美网站模板