【C++动态规划】1547. 切棍子的最小成本|2116

【C++动态规划】1547. 切棍子的最小成本|2116

本文涉及知识点

C++动态规划

LeetCode1547. 切棍子的最小成本

有一根长度为 n 个单位的木棍,棍上从 0 到 n 标记了若干位置。例如,长度为 6 的棍子可以标记如下:

在这里插入图片描述

给你一个整数数组 cuts ,其中 cuts[i] 表示你需要将棍子切开的位置。
你可以按顺序完成切割,也可以根据需要更改切割的顺序。
每次切割的成本都是当前要切割的棍子的长度,切棍子的总成本是历次切割成本的总和。对棍子进行切割将会把一根木棍分成两根较小的木棍(这两根木棍的长度和就是切割前木棍的长度)。请参阅第一个示例以获得更直观的解释。
返回切棍子的 最小总成本 。
示例 1:

在这里插入图片描述

输入:n = 7, cuts = [1,3,4,5]
输出:16
解释:按 [1, 3, 4, 5] 的顺序切割的情况如下所示:

在这里插入图片描述

第一次切割长度为 7 的棍子,成本为 7 。第二次切割长度为 6 的棍子(即第一次切割得到的第二根棍子),第三次切割为长度 4 的棍子,最后切割长度为 3 的棍子。总成本为 7 + 6 + 4 + 3 = 20 。
而将切割顺序重新排列为 [3, 5, 1, 4] 后,总成本 = 16(如示例图中 7 + 4 + 3 + 2 = 16)。
示例 2:

输入:n = 9, cuts = [5,6,1,4,2]
输出:22
解释:如果按给定的顺序切割,则总成本为 25 。总成本 <= 25 的切割顺序很多,例如,[4, 6, 5, 2, 1] 的总成本 = 22,是所有可能方案中成本最小的。

提示:

2 <= n <= 106
1 <= cuts.length <= min(n - 1, 100)
1 <= cuts[i] <= n - 1
cuts 数组中的所有整数都 互不相同

动态规划

将0和n加到cuts中,并排序。m = cuts.size

动态规划的状态表示

dp[i][j] 表示切割端点分别为costs[i],costs[j]的木棍,切割完的最小成本。空间复杂度:O(mm)

动态规划的填表顺序

len = j-i
len = 2 to m

动态规划的转移方程

for(int k = i+1; k < j ;i++)
MinSelf(dp[i][j] ,cost[j]-cost[i]+dp[i][k]+dp[i][j])
单个状态转移时间复杂度:O(m),总时间复杂度:O(mmm)

动态规划的初始化

dp[i][i+1] = 0,其它全部是 INT_MAX/2。

动态规划的返回值

dp[0].back()

代码

核心代码

classSolution{public:intminCost(int n, vector<int>& cuts){ cuts.emplace_back(0); cuts.emplace_back(n);sort(cuts.begin(), cuts.end());constint m = cuts.size(); vector<vector<int>>dp(m,vector<int>(m, INT_MAX /2));for(int i =0; i+1< m; i++){ dp[i][i +1]=0;}int j =0;for(int len =2; len <= m; len++){for(int i =0;(j = i + len -1)< m; i++){for(int k = i +1; k < j; k++){ dp[i][j]=min(dp[i][j], cuts[j]- cuts[i]+ dp[i][k]+ dp[k][j]);}}}return dp[0].back();}};

单元测试

int n; vector<int> cuts;TEST_METHOD(TestMethod11){ n =7, cuts ={1,3,4,5};auto res =Solution().minCost(n, cuts);AssertEx(16, res);}TEST_METHOD(TestMethod12){ n =9, cuts ={5,6,1,4,2};auto res =Solution().minCost(n, cuts);AssertEx(22, 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

深度解析英伟达最新“瓦力”机器人:物理AI时代的开发者红利与技术突破

深度解析英伟达最新“瓦力”机器人:物理AI时代的开发者红利与技术突破

2026年CES展会上,黄仁勋牵着那款酷似《机器人总动员》“瓦力”的Reachy Mini机器人完成流畅互动时,全场的欢呼不仅是对萌系设计的认可,更是对一个新时代的致敬——英伟达用这套全新机器人系统,正式宣告物理AI从实验室走向产业化。对于咱们ZEEKLOG的开发者而言,这波技术浪潮带来的不只是视觉震撼,更是可落地的开发工具、开源生态和商业机遇。今天就从技术内核、开发价值、行业对比三个维度,深度拆解英伟达最新机器人的核心竞争力,帮大家找准入局切入点。 一、不止“萌出圈”:英伟达新机器人的技术内核拆解 很多人被“瓦力”的外形圈粉,但真正让行业震动的是其背后的全栈技术体系。不同于传统机器人“硬件堆砌+单一功能编程”的模式,英伟达这套系统是“大脑-身体-训练场”的全链路协同,每一个环节都为开发者预留了创新空间。 1. 核心大脑:GR00T N1.6模型的双系统突破 作为全球首个开源人形机器人基础模型,最新的Isaac GR00T N1.6堪称“机器人界的GPT-4o”,其最核心的创新是双系统架构设计,完美复刻了人类“本能反应+深度思考”

By Ne0inhk

OpenClaw基础-3-telegram机器人配置与加入群聊

OpenClaw基础-3-telegram机器人配置与加入群聊 💡 大家好,我是可夫小子,《小白玩转ChatGPT》专栏作者,关注AI编程、AI自动化和自媒体。 Openclaw的优势是接入各种聊天工作,在前面的文章里,已经介绍了如何接入飞书。但之前我也提到了,飞书的最大的问题是请求多的限制,以及无法在非认证企业账号下面组建群聊。但这些限制另一个聊天工具可以打破,那就是Telegram,今天就跟大家分享一下,如果在OpenClaw里面接入Telegram。 第一步:Openclaw端配置 通过命令openclaw config,local→channels→telegrams 这里等待输入API Token,接下来我们去Telegram里面获取 第二步:Telegram端配置 1. 1. 在聊天窗口找到BotFather,打开对话与他私聊 2. 3. 然后再输入一个机器人,再输入一个账号名username,这里面要求以Bot或者Bot结尾,这个是全网的id,要 2. /newbot 来创建一个机器人,输入一个名字name

By Ne0inhk

雷达信号处理中的CFAR技术详解

好的,我来为您总结归纳雷达信号处理中的恒虚警(CFAR)技术,并提供一个基于MATLAB的实际用例。 🧐 雷达信号处理之恒虚警(CFAR) 恒虚警率(Constant False Alarm Rate, CFAR)是一种自适应阈值目标检测技术,在雷达信号处理中用于从噪声和杂波背景中检测出目标回波。其核心思想是:无论背景噪声或杂波的功率如何变化,都保持虚警概率( )为一个预先设定的常数。 🎯 1. 基本原理与流程 CFAR算法通过实时估计待检测单元(Cell Under Test, CUT)周围的背景噪声或杂波功率,并根据期望的虚警率 自适应地确定检测阈值 。 主要步骤: 1. 滑动窗口(Detection Window):在待检测数据(通常是距离-多普勒图或距离向数据)上设定一个固定大小的滑动窗口。 2. 单元划分:窗口内的单元被划分为三个部分: * 待检测单元(CUT):位于窗口中心,是我们要判断是否包含目标的单元。 如果 ,则判断不存在目标(No Target)。 如果 ,则判断存在目标(

By Ne0inhk
(保姆级教程)通过官方API搭建一个自己的QQ群聊机器人

(保姆级教程)通过官方API搭建一个自己的QQ群聊机器人

简介 用官方api做了一个qq群聊机器人的demo,有获取天气、简单编辑待办、从本地发送图片等功能。 建了个群,欢迎来交流( QQ群号:710101225 重新写了个基于nonebot框架的教程,个人认为比官方sdk更容易开发:https://blog.ZEEKLOG.net/Clovertaa/article/details/145452834 获取 机器人demo GitHub仓库:GitHub - ClovertaTheTrilobita/SanYeCao-bot: 一个基于官方API的QQ群聊机器人 官方SDK GitHub仓库:GitHub - tencent-connect/botpy: QQ频道机器人PythonSDK 教程 前置需求 本项目使用conda环境和git操作。如果未安装这两个工具请首先移步 史上最全最详细的Anaconda安装教程-ZEEKLOG博客 Git 详细安装教程(详解 Git 安装过程的每一个步骤)_git安装-ZEEKLOG博客 (这俩教程我粗略看了下感觉挺好的,如果不适合你那烦请自行百度了qwq) 一

By Ne0inhk