【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

【Linux系统编程】(四十二)吃透线程互斥!从原理到实战,手把手教你玩转 Linux 下的互斥锁

【Linux系统编程】(四十二)吃透线程互斥!从原理到实战,手把手教你玩转 Linux 下的互斥锁

目录 前言 一、线程互斥的核心概念:搞懂这些,才算入门 1.1 共享资源与临界资源 1.2 临界区 1.3 互斥的定义 1.4 原子性:互斥的底层要求 二、多线程共享资源的坑:亲眼看看问题出在哪 2.1 问题代码:未加互斥的售票系统 2.2 编译运行与异常结果 2.3 问题根源:三步分析 (1)线程调度的随机性 (2)耗时操作放大了竞争问题 (3)ticket--本身不是原子操作 2.4 解决问题的核心要求 三、Linux 下的互斥量:mutex 的使用全解析 3.1 互斥量的类型与核心接口

By Ne0inhk
Linux 磁盘基础:从物理结构到 CHS/LBA 寻址,吃透数据存储底层逻辑

Linux 磁盘基础:从物理结构到 CHS/LBA 寻址,吃透数据存储底层逻辑

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 磁盘硬件基础:机械结构与存储单元 * 1.1 磁盘物理组成 * 1.2 磁盘容量计算 * 1.3 核心概念辨析:磁道、柱面、扇区 * 二. 磁盘逻辑结构:系统对物理硬件的抽象 * 2.1 多维度理解和理清磁盘逻辑结构 * 2.2 逻辑结构的本质 * 2.3 逻辑结构的核心优势 * 三. CHS 寻址:早期的物理坐标定位 * 3.1 CHS 寻址原理 * 3.2

By Ne0inhk
Flutter 三方库 sparky 的鸿蒙化适配指南 - 实现极简 2D 游戏引擎功能、支持高效精灵图渲染与跨端游戏逻辑

Flutter 三方库 sparky 的鸿蒙化适配指南 - 实现极简 2D 游戏引擎功能、支持高效精灵图渲染与跨端游戏逻辑

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 sparky 的鸿蒙化适配指南 - 实现极简 2D 游戏引擎功能、支持高效精灵图渲染与跨端游戏逻辑 前言 在 Flutter for OpenHarmony 的娱乐化开发领域,我们有时需要构建一些轻量级的小游戏或交互动效,但又不想引入像 Flame 这样的大型游戏引擎。sparky 是一个定位极其精简的 2D 游戏开发框架。它提供了基础的层级管理、精灵渲染和碰撞检测。本文将探讨如何在鸿蒙端利用 sparky 快速搭建游戏原型。 一、原理解析 / 概念介绍 1.1 基础原理 sparky 通过在 Flutter 的 CustomPainter 之上建立了一套简易的场景树(Scene Tree)。它将每一个游戏元素抽象为节点,并提供高频刷新的引擎循环(Engine

By Ne0inhk
Flutter 三方库 flutter_connectivity 的鸿蒙化适配指南 - 实现具备网络类型感知与连通性自愈的状态管理、支持端侧多网融合环境下的业务自适应实战

Flutter 三方库 flutter_connectivity 的鸿蒙化适配指南 - 实现具备网络类型感知与连通性自愈的状态管理、支持端侧多网融合环境下的业务自适应实战

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_connectivity 的鸿蒙化适配指南 - 实现具备网络类型感知与连通性自愈的状态管理、支持端侧多网融合环境下的业务自适应实战 前言 在进行 Flutter for OpenHarmony 的全场景应用开发时,网络状态的剧烈波动(如从 WiFi 切换到 4G/5G,或进入无信号的电梯)是影响用户体验的关键因素。如何实现毫秒级的网络类型探测并据此优化 UI 策略?flutter_connectivity(或其增强分支)是处理此类需求的经典库。本文将探讨如何在鸿蒙端构建极致灵敏的网络状态感知体系。 一、原直观解析 / 概念介绍 1.1 基础原理 该库通过监听鸿蒙系统的网络状态变更广播(Broadcast)或利用端侧轮询机制,实时捕获当前活跃网络接口(Interface)的变化。它将复杂的系统底层网络状态抽象为 wifi, mobile,

By Ne0inhk