news 2026/6/23 16:58:41

day166—递归—多边形三角剖分的最低得分(LeetCode-1039)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
day166—递归—多边形三角剖分的最低得分(LeetCode-1039)

题目描述

你有一个凸的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

解决方案:

这段代码是基于记忆化递归求解 “多边形三角剖分的最低得分” 问题的完整正确实现,核心思路是通过递归拆分多边形为子问题,结合记忆化缓存避免重复计算,最终得到整个多边形三角剖分的最小得分。

核心逻辑

  1. 核心定义

    • memo:二维记忆化数组(len×len),memo[begin][end]缓存顶点区间[begin, end]构成的子多边形三角剖分的最低得分,初始值为0xFFFFFF(标记 “未计算”);
    • dfs(begin, end, s):返回顶点区间[begin, end]三角剖分的最低得分,s为顶点值数组(传引用避免拷贝)。
  2. 递归边界

    • begin+1==end(仅 2 个顶点,无法构成三角形):返回 0(无剖分得分,是问题的基础边界);
    • 主函数补充len<3返回 0(边界防护:顶点数不足 3 时无法剖分,直接返回 0)。
  3. 记忆化优化:递归开始时先检查memo[begin][end]!=0xFFFFFF,若命中缓存(已计算过该区间的最小得分),则直接返回缓存值,避免重复递归计算,将时间复杂度从纯递归的O(2n)降至O(n3)(n为顶点数)。

  4. 核心状态转移(问题本质):枚举分割点ibegin < i < end),将[begin, end]多边形拆分为三个部分:

    • 左子多边形[begin, i]的剖分得分:dfs(begin, i, s)
    • 右子多边形[i, end]的剖分得分:dfs(i, end, s)
    • 当前三角形begin-i-end的得分:s[begin] * s[i] * s[end];总得分是三者之和,通过min取所有分割点对应的最小得分,即为[begin, end]区间的最低剖分得分。
  5. 主函数逻辑:初始化记忆化数组(填充0xFFFFFF标记未计算),调用dfs(0, len-1, values)计算整个多边形(顶点0~len-1)的最低剖分得分并返回。

关键特点

  • 逻辑完整:覆盖了边界条件、记忆化缓存、核心得分计算的所有关键环节,是该问题的标准记忆化递归解法;
  • 效率可控:记忆化缓存彻底避免重复递归,能处理中等规模的顶点数输入;
  • 实现简洁:基于递归框架,贴合 “将大问题拆分为子问题” 的动态规划思想,易理解、易维护。

总结

  1. 核心思路:通过递归枚举所有分割点,将大多边形拆分为子多边形 + 三角形,取所有剖分方式的得分最小值,结合记忆化缓存优化效率;
  2. 关键设计:memo数组是效率核心,分割点枚举 + 子问题递归 + 得分求和取最小是逻辑核心;
  3. 功能效果:能正确计算任意合法顶点数组的多边形三角剖分最低得分,结果无偏差。

values = [3,7,4,5]为例,代码会枚举分割点i=1i=2,计算所有剖分方式的得分后取最小值 144,返回正确结果。

函数源码:

class Solution { public: vector<vector<int>> memo={}; int dfs(int begin,int end,vector<int>& s){ int min_x=0xFFFFFF; if(begin+1==end) return 0; if(memo[begin][end]!=0xFFFFFF) return memo[begin][end]; for(int i=begin+1;i<end;i++){ min_x=min(min_x,dfs(begin,i,s)+dfs(i,end,s)+s[begin]*s[i]*s[end]); } memo[begin][end]=min_x; return min_x; } int minScoreTriangulation(vector<int>& values) { int len=values.size(); if(len<3)return 0; memo.assign(len,vector<int>(len,0xFFFFFF)); return dfs(0,len-1,values); } };
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/18 16:04:54

Nacos CVE-2021-29442

CVE-2021-29442 是 Nacos 中一个认证绕过 远程代码执行&#xff08;RCE&#xff09; 的高危漏洞&#xff0c;主要影响 Nacos 1.4.1 及以下版本&#xff0c;漏洞的核心原因是&#xff1a; Nacos 默认的鉴权实现存在逻辑缺陷&#xff0c;攻击者可以通过构造特殊的 HTTP 请求头绕…

作者头像 李华
网站建设 2026/6/16 9:30:50

(新卷,200分)- 区块链文件转储系统(Java JS Python)

(新卷,200分)- 区块链文件转储系统&#xff08;Java & JS & Python&#xff09; 题目描述 区块链底层存储是一个链式文件系统&#xff0c;由顺序的N个文件组成&#xff0c;每个文件的大小不一&#xff0c;依次为F1,F2,...,Fn。随着时间的推移&#xff0c;所占存储会越…

作者头像 李华
网站建设 2026/6/12 13:54:20

制造业七大核心系统盘点——ERP、MES、WMS、SCM、PLM、SCADA、QMS

我这几年跑工厂、聊老板、跟信息化负责人沟通&#xff0c;听到最多的一句话不是我们没系统&#xff0c;而是&#xff1a;ERP 上了&#xff0c;车间还是一团乱MES 买了&#xff0c;数据没人信仓库有系统&#xff0c;库存还是对不上系统一堆&#xff0c;但问题一个没少这时候很多…

作者头像 李华
网站建设 2026/6/20 8:06:38

前端使用docker打包nuxt官网项目

安装docker的文章在另一篇&#xff1a;https://blog.csdn.net/m0_69727853/article/details/154741168?spm1001.2014.3001.5501 1. 查看docker是否安装成功 docker -v 2. 如果显示没有docker&#xff0c;查看当前的环境变量是否正确 tips提示&#xff1a;如果找不到安装的doc…

作者头像 李华
网站建设 2026/6/9 0:30:00

Java计算机毕设之基于Java+springboot的寿险公司人力资源管理系统基于SpringBoot的人力资源管理系统(完整前后端代码+说明文档+LW,调试定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/6/20 11:56:47

PolarDB-X 企业版分布式集群部署文档

目录PolarDB-X 企业版分布式集群部署文档快速连接快速连接命令集群信息集群状态Pod 列表服务列表镜像版本安装步骤1. 安装 Helm2. 创建命名空间3. 添加 Helm 仓库并安装 Operator4. 获取最新镜像版本5. 创建集群配置文件6. 部署集群7. 监控部署进度8. 获取连接密码集群架构架构…

作者头像 李华