1547. 切棍子的最小成本

Problem: 1547. 切棍子的最小成本

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

本题的目标是在给定长度为 n 的棍子上,根据预设的切割点 cuts 进行切割,使得总的切割成本最小。每次切割的成本等于切割后两段棍子的长度之和。由于切割点可以任意选择,但切割成本由切割后两端的长度决定,因此这是一个典型的动态规划问题。关键在于如何定义状态以及转移方程。状态定义为在给定两个端点的情况下,计算最优切割成本。为了简化问题,我们首先对切割点进行排序,并将棍子的起点和终点也视为切割点加入到列表中。然后使用一个二维数组 dp 来存储从一个切割点到另一个切割点之间的最小成本,其中 dp[i][j] 表示从第 i 个切割点到第 j 个切割点(包含这两个点)的最小成本。

解题方法

首先,将所有切割点按位置从小到大排序,并将棍子的起点和终点添加进切割点列表。初始化 dp 数组,其中 dp[i][i] 被设置为切割当前点的成本,即下一个点与前一个点的距离。使用两层循环遍历所有可能的切割点组合,从短的区间向长的区间推进,以确保在计算较长区间的最小成本时已经计算了所有较短区间的成本。
对于每个区间,尝试在该区间内所有的切割点上切割,选取成本最低的方案。

复杂度

时间复杂度:

O ( m 3 ) O(m 3 ) O(m3),其中 m 是切割点的数量(包括棍子的起点和终点)。这是因为我们需要遍历所有可能的区间,并在每个区间内尝试所有可能的切割点。

空间复杂度:

O ( m 2 ) O(m 2 ) O(m2),这是由于我们使用了一个二维数组 dp 来存储所有区间内的最小成本。

Code

class Solution {public int minCost1(int n, int[] cuts) {int m = cuts.length;Arrays.sort(cuts);int[] arr = new int[m + 2];for(int i = 1; i <= m; i++) {arr[i] = cuts[i - 1];}arr[m + 1] = n;int[][] dp = new int[m + 2][m + 2];for(int i = 0; i <= m + 1; i++) {for(int j = 0; j <= m + 1; j++) {dp[i][j] = -1;}}return f(arr, 1, m, dp);}public int f(int[] arr, int l, int r, int[][] dp) {if (l > r) {return 0;}if (l == r) {return arr[r + 1] - arr[l - 1];}if (dp[l][r] != -1) {return dp[l][r];}int ans = Integer.MAX_VALUE;for (int k = l; k <= r; k++) {ans = Math.min(ans, f(arr, l, k - 1, dp) + f(arr, k + 1, r, dp));}ans += arr[r + 1] - arr[l - 1];dp[l][r] = ans;return ans;}public int minCost(int n, int[] cuts) {int m = cuts.length;Arrays.sort(cuts);int[] arr = new int[m + 2];for(int i = 1; i <= m; i++) {arr[i] = cuts[i - 1];}arr[m + 1] = n;int[][] dp = new int[m + 2][m + 2];for(int i = 1; i <= m; i++) {dp[i][i] = arr[i + 1] -arr[i - 1];}for(int l = m - 1,next; l >= 1; l--) {for(int r = l + 1; r <= m; r++) {next = Integer.MAX_VALUE;for(int k = l; k <= r; k++) {next = Math.min(next, dp[l][k - 1] + dp[k + 1][r]);}dp[l][r] = arr[r + 1] - arr[l - 1] + next;}}return dp[1][m];}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/31150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot框架的原理及应用详解(六)

本系列文章简介&#xff1a; 在当今的软件开发世界中&#xff0c;快速迭代、高效开发以及易于维护成为了开发者们不断追求的目标。Spring Boot作为Spring框架的一个子项目&#xff0c;自其诞生以来就凭借其“约定大于配置”的理念和自动配置的特性&#xff0c;迅速在Java开发社…

密码学及其应用——公钥加密与公钥基础设施(PKI)

1. 引言 在当今的数字世界中&#xff0c;安全通信变得尤为重要。我们每天发送和接收的大量电子邮件和其他类型的在线消息都可能包含敏感信息。为了保护这些信息&#xff0c;我们可以利用公钥加密和公钥基础设施&#xff08;PKI&#xff09;。本文将通过安全邮件交换的示例&…

解决数据丢失问题的MacOS 数据恢复方法

每个人都经历过 Mac 硬盘或 USB 驱动器、数码相机、SD/存储卡等数据丢失的情况。我们中的一些人可能认为已删除或格式化的数据将永远丢失&#xff0c;因此就此作罢。对于 macOS 用户来说&#xff0c;当文件被删除时&#xff0c;垃圾箱已被清空&#xff0c;他们可能不知道如何恢…

pytorch lighting: Trying to resize storage that is not resizable

问题 在用pytorch lighting进行训练时碰到如下错误 即 Trying to resize storage that is not resizable 。 解决方案 在dataloader采样图片以及label时&#xff0c;保证每次采样的图片的分辨率不变。

Mistral AI 发布 Codestral-22B,精通 80+ 编程语言,22B 参数超越 70B Code Llama

前言 大型语言模型 (LLM) 在代码生成领域展现出巨大的潜力&#xff0c;但现有的模型在支持的编程语言数量、生成速度和代码质量方面仍存在局限性。法国 AI 独角兽 Mistral AI 近期发布了其首款代码生成模型 Codestral-22B&#xff0c;宣称在多项指标上超越了 GPT-4 和 Llama3&…

Spring Boot源码分析一:启动流程

1. 引言 SpringBoot是一个广泛使用的Java框架&#xff0c;旨在简化基于Spring框架的应用程序的开发过程。在这篇文章中&#xff0c;我们将深入探讨SpringBoot应用程序的启动流程&#xff0c;了解其背后的机制。 2. Spring Boot 启动概览 SpringBoot应用程序的启动通常从一个…

健康与生活助手:Kompas AI的高效应用

一、引言 在现代社会&#xff0c;随着生活节奏的加快和工作压力的增加&#xff0c;人们的健康问题日益凸显。健康管理已经成为每个人关注的重点。Kompas AI作为一款智能助手&#xff0c;通过其先进的人工智能技术&#xff0c;为用户提供全面的健康管理服务&#xff0c;帮助用户…

JavaSE 利用正则表达式进行本地和网络爬取数据(爬虫)

爬虫 正则表达式的作用 作用1&#xff1a;校验字符串是满足规则 作用2&#xff1a;在一段文本中查找满足需要的内容 本地爬虫和网络爬虫 Pattern类 表示正则表达式 Matter类 文本编译器&#xff0c;作用按照正则表达式的规则去读取字符串&#xff0c;从头开始读取&#xf…

爬虫day2

bs4解析-HTML语法 bs4解析比较简单,但是呢,首先你需要了解一丢丢的html知识,然后再去使用bs4去提取,逻辑和编写难度就会非常简单和清晰. HTML(Hyper Text Markup Language)超文本标记语言,是我们编写网页的最基本也是最核心的一种语言.其语法规则就是用不同的标签对网页上的内…

中间件(express)

中间件&#xff08;express&#xff09; 在Express.js中&#xff0c;中间件&#xff08;Middleware&#xff09;是一个重要的组成部分&#xff0c;用于处理HTTP请求和响应。中间件函数具有特定的签名&#xff0c;并可以接受请求对象&#xff08;req&#xff09;、响应对象&…

[python学习]--使用相对路径导入包

在Python中&#xff0c;使用相对路径导入包或模块通常是在包内部进行的&#xff0c;以便在不指定完整包路径的情况下引用同一包内的其他模块。相对导入使用点&#xff08;.&#xff09;来表示当前包或父包。但是&#xff0c;需要注意的是&#xff0c;相对导入在包的外部&#x…

【idea】gradle多模块构建项目内存溢出终止问题解决

背景 idea构建多模块项目&#xff0c;构建报错 Daemon is stopping immediately JVM garbage collector thrashing and after running out of JVM memory 解决 进到下图目录下 在文件管理中进入上面目录添加gradle.properties文件&#xff0c;内容如下 org.gradle.jvmargs-…

【TensorFlow深度学习】在深度学习项目中实施迁移学习策略

在深度学习项目中实施迁移学习策略 在深度学习项目中实施迁移学习策略:加速模型训练与提升性能的艺术1. 迁移学习简介与优势2. 迁移学习的类型3. 代码示例:使用Keras实施特征提取4. 微调模型以进一步提升性能5. 结果评估与模型保存结语在深度学习项目中实施迁移学习策略:加速…

hive on spark 的架构和常见问题 - hive on spark 使用的是 yarn client 模式还是 yarn cluster 模式?

hive on spark 的架构和常见问题 - hive on spark 使用的是 yarn client 模式还是 yarn cluster 模式&#xff1f; 1. 回顾下 spark 的架构图和部署模式 来自官方的经典的 spark 架构图如下&#xff1a; 上述架构图&#xff0c;从进程的角度来讲&#xff0c;有四个角色/组件&…

【面试干货】抽象类与接口的区别

【面试干货】抽象类与接口的区别 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java编程中&#xff0c;抽象类和接口是两个非常重要的概念&#xff0c;它们都为代码的可扩展性和复用性提供了基础。但是&#xff0c;它们之间也有一些明显…

架构师之 Kafka 核心概念入门

Kafka 核心概念 作为架构师,理解 Kafka 的核心概念至关重要。这些概念是构建高效、可靠的 Kafka 系统的基础。 以下是需要掌握的 Kafka 核心概念及其详细说明: 1. Topic 定义:Topic 是 Kafka 中用于存储和分类消息的逻辑命名空间。每个 Topic 代表一类数据流, 例如日志、…

maxwell源码编译安装部署

目录 1、组件环境 2、maxwell安装前提 3、maxwell安装 3.1、maxwell下载 3.1.1、最新版本下载 ​编辑 3.1.2、历史版本下载 3.2、maxwell安装 3.3、maxwell配置 3.2.1、mysql开启binlog 3.3.2、maxwell元数据配置 3.3.3、maxwell配置任务 4、maxwell部署问题 4.1、utf…

django学习入门系列之第三点《CSS基础样式介绍1》

文章目录 高度和宽度块级标签|行内标签的转换字体和颜色往期回顾 高度和宽度 如果在块级标签内&#xff0c;单独定义高度的话&#xff0c;宽度会默认拉满 使用百分比的时候 如果是块级标签&#xff0c;宽度可以用百分比&#xff0c;高度用不了&#xff08;使用起来没效果&…

Mac OS 安装frida

安装frida和frida-tools Python是基础&#xff0c;提前装好Python 终端执行 python3 -m pip install frida 如果出现error 按照提示处理 信息提示&#xff1a;brew install pipx 于是终端执行&#xff1a; brew install pipx 安装frida&#xff1a; pipx install frida…

jetson设置

首先准备一张16g以上的sd卡 点此下载sd套件 https://www.sdcard.org/downloads/formatter/eula_windows/SDCardFormatterv5_WinEN.zip 这里下载sd卡格式化 然后https://etcher.download/download-etcher/ 下载etcher 看这篇https://blog.csdn.net/automoblie0/article/deta…