【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详细安装教程——Python及PyCharm超详细安装教程:新手小白也能轻松搞定!(最新版)

Python详细安装教程——Python及PyCharm超详细安装教程:新手小白也能轻松搞定!(最新版)

Python作为一门简单易学、功能强大的编程语言,近年来在数据分析、人工智能、Web开发等领域广受欢迎。而PyCharm作为一款专业的Python集成开发环境(IDE),提供了强大的代码编辑、调试和项目管理功能,是Python开发者的得力助手。本文将详细介绍如何从零开始安装Python和PyCharm,帮助新手小白快速搭建Python开发环境。 一、安装前准备 在安装Python和PyCharm之前,我们需要做一些准备工作,以确保安装过程顺利进行。 1.检查系统要求 (1)操作系统:Windows 7及以上版本。 如何查看自己的操作系统版本: 按下键盘上的“Windows键 + R”组合键,打开“运行”对话框。 输入winver命令,然后按下“回车”键。弹出的“关于Windows”窗口将显示当前操作系统的详细版本信息,包括版本号、内部版本号和系统构建信息。 此外,也可以鼠标左键单击”此电脑“,然后鼠标单击右键,在打开的对话框中点击”属性“,即可查看此电脑的操作系统版本。 本文将以Windows10专业版为例。 (2)内存:

By Ne0inhk
Python开篇:撬动未来的万能钥匙 —— 从入门到架构的全链路指南

Python开篇:撬动未来的万能钥匙 —— 从入门到架构的全链路指南

Python:撬动未来的万能钥匙——从入门到架构的全链路指南 在技术的星空中,Python 是那颗永不陨落的超新星——它用简洁的语法点燃创造之火,以庞大的生态铺就革新之路。无论你身处哪个领域,这把钥匙正在打开下一个时代的大门。2024 年 TIOBE 指数显示,Python 连续五年稳居编程语言榜首,其开发者社区规模同比增长 42%,成为全球技术变革的核心驱动力。 前言     Python以其简洁优雅的语法和强大的通用性,成为当今最受欢迎的编程语言。本专栏旨在系统性地带你从零基础入门到精通Python核心。无论你是零基础小白还是希望进阶的专业开发者,都将通过清晰的讲解、丰富的实例和实战项目,逐步掌握语法基础、核心数据结构、函数与模块、面向对象编程、文件处理、主流库应用(如数据分析、Web开发、自动化)以及面向对象高级特性,最终具备独立开发能力和解决复杂问题的思维,高效应对数据分析、人工智能、Web应用、自动化脚本等广泛领域的实际需求。 🥇 点击进入Python入门专栏,Python凭借简洁易读的语法,是零基础学习编程的理想选择。本专栏专为初学者设计,系统讲解Python核

By Ne0inhk
深入理解 Python HTTP 请求:从基础到高级实战指南

深入理解 Python HTTP 请求:从基础到高级实战指南

目录 * 深入理解 Python HTTP 请求:从基础到高级实战指南 * 章节1:HTTP 协议基础与 Python 生态概览 * HTTP 的核心概念 * Python HTTP 库生态 * 章节2:Requests 库实战:从简单的 GET 到复杂的 API 交互 * 2.1 发送 GET 请求与参数处理 * 2.2 处理 POST 请求与数据提交 * 2.3 必不可少的 Headers 与 Session * 章节3:高级话题:异常处理、超时控制与性能优化 * 3.1 异常处理 (Error Handling) * 3.

By Ne0inhk
全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表

全网最全!Python、PyTorch、CUDA 与显卡版本对应关系速查表

摘要:搞深度学习,最痛苦的不是写代码,而是配环境! “为什么我的 PyTorch 认不出显卡?” “新买的显卡装了旧版 CUDA 为什么报错?” 本文提供一份保姆级的版本对应关系速查表,涵盖从 RTX 50 系列 (Blackwell) 到经典老卡的软硬件兼容信息。建议收藏保存,每次配环境前查一下,能省下大量的排坑时间! 🗺️ 核心逻辑图解 在看表格前,先理清显卡架构的代际关系与 CUDA 版本的强绑定逻辑。 📊 一、PyTorch 版本对照表 (推荐) PyTorch 是目前兼容性最好的框架,只要 CUDA 驱动版本 足高,通常都能向下兼容。对于使用最新硬件(如 RTX 50 系)的用户,请务必使用 2.4 或更高版本。 PyTorch 版本Python 版本推荐 CUDA适用显卡建议2.

By Ne0inhk