【C++动态规划 数学】1039. 多边形三角剖分的最低得分|2130

【C++动态规划 数学】1039. 多边形三角剖分的最低得分|2130

本文涉及知识点

C++动态规划 数学

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

你有一个凸的 n 边形,其每个顶点都有一个整数值。给定一个整数数组 values ,其中 values[i] 是第 i 个顶点的值(即 顺时针顺序 )。
假设将多边形 剖分 为 n - 2 个三角形。对于每个三角形,该三角形的值是顶点标记的乘积,三角剖分的分数是进行三角剖分后所有 n - 2 个三角形的值之和。
返回 多边形进行三角剖分后可以得到的最低分 。
示例 1:
输入:values = [1,2,3]

在这里插入图片描述

输出:6
解释:多边形已经三角化,唯一三角形的分数为 6。
示例 2:

在这里插入图片描述

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

在这里插入图片描述

输入:values = [1,3,1,4,1,5]
输出:13
解释:最低分数三角剖分的得分情况为 113 + 114 + 115 + 111 = 13。
提示:
n == values.length
3 <= n <= 50
1 <= values[i] <= 100

动态规划

动态规划的状态表示

dp[ct] [i]表示 端点:i,(i+1)%n,(i+2)%n,(i+3)%n ⋯ \cdots ⋯ (i+n-1)%n 组成的多边形的最小分数。
cnt < 3,无意义。空间复杂度:O(nn)

动态规划的填表顺序

ct = 4 to n 枚举后置状态

动态规划的转移方程

对 ∀ \forall ∀ ct,i

for(int j = i +1; j < i + ct-1; j++){constint c1 = j - i +1; dp[ct][i]=min(dp[ct][i],dp[c1][i]+ dp[ct+1-c1][(j)%N]+ values[i]* values[(i+ct-1)%N]* values[j%N]);}
在这里插入图片描述


注意:i到i+ct-1一定是连续的,i+ct-1到i不一定连续,即:(i+ct)%N 不一定等于i,故只能拆一个三角形出来,不能拆一条线。

单个状态转移的时间复杂度:O(n) 总时间复杂度:O(nnn)

动态规划的初始值

dp[3][i] = values[i]*values[(i+1)%n]*values[(i+2)%n]
dp[2] 等于0

动态规划的返回值

任意边一定和顺时针的临边或逆时针的临边组成三角型。
以边i,i+1 比例,要么是 i ,i+1,i+2, 要么是i-1,i,i+1。我们枚举:
dp[3][i] + dp[N-1][i+2]一定能枚举到这两种情况。

代码

核心代码

classSolution{public:intminScoreTriangulation(vector<int>& values){constint N = values.size(); vector<vector<int>>dp(N+1,vector<int>(N, INT_MAX /2)); dp[2].assign(N,0);for(int i =0; i < N; i++){ dp[3][i]= values[i]* values[(i +1)% N]* values[(i +2)% N];}for(int ct =4; ct < N; ct++){for(int i =0; i < N; i++){for(int j = i +1; j < i + ct-1; j++){constint c1 = j - i +1; dp[ct][i]=min(dp[ct][i],dp[c1][i]+ dp[ct+1-c1][(j)%N]+ values[i]* values[(i+ct-1)%N]* values[j%N]);}}}int ans = INT_MAX;for(int i =0; i < N; i++){ ans =min(ans, dp[3][i]+ dp[N-1][(i +2)% N]);}return ans;}};

单元测试

vector<int> values;TEST_METHOD(TestMethod11){ values ={1,2,3};auto res =Solution().minScoreTriangulation(values);AssertEx(6, res);}TEST_METHOD(TestMethod12){ values ={3,7,4,5};auto res =Solution().minScoreTriangulation(values);AssertEx(144, res);}TEST_METHOD(TestMethod13){ values ={1,3,1,4,1,5};auto res =Solution().minScoreTriangulation(values);AssertEx(13, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步ZEEKLOG学院,听白银讲师(也就是鄙人)的讲解。
https://edu.ZEEKLOG.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.ZEEKLOG.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

Read more

Python中的del语句与垃圾回收机制深度解析

Python中的del语句与垃圾回收机制深度解析

Python中的del语句与垃圾回收机制深度解析 * 引言:内存管理的艺术 * 一、垃圾回收算法:引用计数的核心原理 * 1.1 引用计数机制详解 * 1.2 对象回收的条件 * 1.3 引用计数的优缺点分析 * 二、Python与C++删除语句的哲学差异 * 2.1 C++的DELETE:直接而果断 * 2.2 Python的del:优雅而间接 * 三、Python垃圾回收机制的演进 * 3.1 CPython 2.0前的简单世界 * 3.2 CPython 2.0引入分代回收 * 四、魔法函数__del__:最后的告别 * 4.1 __del__方法的作用 * 4.2 使用注意事项

By Ne0inhk

如何在Windows中安装并切换多个Python版本?90%的开发者都忽略的关键步骤

第一章:Windows下多版本Python管理的必要性与挑战 在现代软件开发中,不同项目往往依赖于特定版本的Python解释器。由于第三方库的兼容性差异、语言特性的演进以及框架对Python版本的要求,开发者经常需要在同一台Windows机器上维护多个Python版本。这种需求催生了对高效版本管理机制的迫切需要。 为何需要管理多个Python版本 * 某些旧项目依赖Python 3.7或更早版本,无法直接升级 * 新兴框架如Django或FastAPI可能仅支持Python 3.8+ * 测试代码在不同解释器环境下的行为一致性需要验证 面临的主要挑战 Windows系统默认不提供原生的Python版本切换工具,导致以下问题: 1. 环境变量PATH频繁手动修改,易出错且繁琐 2. IDE可能无法正确识别当前使用的Python解释器 3. 虚拟环境与实际Python版本之间可能出现混淆 例如,当用户安装Python 3.9和3.11后,命令行输入 python --version可能始终指向最先安装的版本,除非手动调整安装路径顺序。这会引发不可预期的行为。 R

By Ne0inhk

Python 简介与入门

一、Python 是什么 Python 是一门解释型、面向对象、跨平台的通用编程语言,由吉多・范罗苏姆于 1991 年发布。它以简洁易读、语法优雅为核心特点,摒弃了 C/C++、Java 等语言繁琐的语法规则,让开发者能更专注于业务逻辑本身,而非代码格式,是编程入门的首选语言,也被广泛应用于各类工程开发场景。 简单来说,Python 能帮我们实现工作自动化(如文件批量处理、数据自动整理)、软件开发(如网站、小游戏、GUI 程序),还能解决专业开发中 “编译 - 测试” 周期长的问题,是兼顾入门友好和工业级应用的编程语言。 二、Python 的核心优势 1. 易上手,可读性强:语法接近自然语言,新手能快速入门,代码书写规范统一,团队协作时易读易维护。 2. 功能强大,

By Ne0inhk

Python 数据分析第三版(一)

原文:annas-archive.org/md5/74a7b24994c40ad3a90c290c07b529df 译者:飞龙 协议:CC BY-NC-SA 4.0 序言 数据分析使你能够通过发现新的模式和趋势,从大数据和小数据中创造价值,而 Python 是分析各种数据的最受欢迎工具之一。本书将带你快速入门 Python 数据分析,探索数据分析中的不同阶段和方法论,并学习如何使用 Python 生态系统中的现代库来创建高效的数据管道。 本书从使用 Python 进行基本统计和数据分析入手,你将通过简单易懂的示例进行复杂的数据分析与建模、数据处理、数据清理和数据可视化。接着,你将学习如何使用 ARMA 模型进行时间序列分析和信号处理。随着深入学习,你还将掌握如何使用机器学习算法(如回归、分类、主成分分析(PCA)和聚类)进行智能处理和数据分析。在最后几章中,你将通过实际案例分析文本数据和图像数据,分别使用自然语言处理(NLP)和图像分析技术。最后,本书还将展示如何使用

By Ne0inhk