1000. 合并石头的最低成本

Problem: 1000. 合并石头的最低成本

文章目录

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

思路

这道题目的核心在于理解合并石头的过程和寻找最优策略。给定一个数组 stones 表示石堆,以及一个整数 k 表示每次可以合并的石堆数量,目标是找到将所有石堆合并成一个石堆的最小成本,每次合并相邻的 k 个石堆需要消耗的成本为这些石堆中石头的总和。观察题目条件,合并过程具有最优子结构,可以通过动态规划解决。难点在于确定状态转移方程,因为合并操作不是简单的两两合并,而是每次可以合并 k 个连续的石堆,因此需要设计一个二维的动态规划数组来记录区间内石堆合并的最小成本。

解题方法

预处理前缀和:首先计算出 preSum 数组,用于快速获取区间内石堆的总重量,加速后续计算。初始化动态规划数组:由于合并操作的特殊性(每次合并 k 个),我们需要用二维数组 dp[l][r] 来记录从索引 l 到 r 区间内所有石堆合并的最小成本。初始化时不需要特别设置,因为后续会覆盖。状态转移:从长度较小的子区间开始递推到整个区间,对于每个区间 [l, r],枚举其中可以作为最后一次合并操作结束位置的所有 m(步长为 k-1),计算通过 dp[l][m] 和 dp[m+1][r] 合并的成本,并累加区间内的石堆总重量(当 (r-l) % (k-1) == 0 时),取最小值作为 dp[l][r] 的值。检查可行性:在开始动态规划之前,先判断是否能刚好合并成一个石堆,即 (n-1) % (k-1) == 0,若不满足则直接返回 -1,表示无法按规则完成合并。返回结果:最终 dp[0][n-1] 即为所求的最小成本。

复杂度

时间复杂度:

O ( n 3 ) O(n^3) O(n3)。主要消耗在三层循环上,尽管外层循环随着 l 增加而减少迭代次数,但总体仍接近立方级别。

空间复杂度:

O ( n 2 ) O(n^2) O(n2)。需要一个 n × n 的二维数组来存储动态规划的状态。

Code

class Solution {public int mergeStones(int[] stones, int k) {int n = stones.length;if((n - 1) % (k - 1) != 0) {return -1;}int[] preSum = new int[n + 1];for(int i = 1; i <= n; i++) {preSum[i] += stones[i - 1];preSum[i] += preSum[i - 1];}int[][] dp = new int[n][n];for(int l = n - 2, ans; l >= 0; l--) {for(int r = l + 1; r < n; r++) {ans = Integer.MAX_VALUE;for(int m = l; m < r; m += k - 1) {ans = Math.min(ans, dp[l][m] + dp[m + 1][r]);}if((r - l) % (k - 1) == 0) {ans += preSum[r + 1] - preSum[l];}dp[l][r] = ans;}}return dp[0][n - 1];}
}

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

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

相关文章

ORA-6544[pevm_peruws_callback-1][604] is caused (Doc ID 2638095.1)

ORA-6544[pevm_peruws_callback-1][604] is caused (Doc ID 2638095.1)​编辑To Bottom In this Document Symptoms Cause Solution References Applies to: Oracle Database - Enterprise Edition - Version 12.2.0.1 and later Information in this document applies to an…

嵌入式工具:VI、GCC、GDB、makefile

目录 1.Vi 2.gcc 3 gdb 4.makefile 参考 1.Vi VI 是一种编辑器,有很多版本。它有三种工作模式:编辑模式(启动时默认的模式)、插入模式(按下i或a键即可进入)、最后一行模式(又叫命令模式)。 1.1 最后一行模式常用命令 W:保存文件; q:退出; q!:强行退出不保…

C++并发之环形队列(ring,queue)

目录 1 概述2 实现3 测试4 运行 1 概述 最近研究了C11的并发编程的线程/互斥/锁/条件变量&#xff0c;利用互斥/锁/条件变量实现一个支持多线程并发的环形队列&#xff0c;队列大小通过模板参数传递。 环形队列是一个模板类&#xff0c;有两个模块参数&#xff0c;参数1是元素…

[学习笔记] 禹神:一小时快速上手Electron笔记,附代码

课程地址 禹神&#xff1a;一小时快速上手Electron&#xff0c;前端Electron开发教程_哔哩哔哩_bilibili 笔记地址 https://github.com/sui5yue6/my-electron-app 进程通信 桌面软件 跨平台的桌面应用程序 chromium nodejs native api 流程模型 main主进程 .js文件 node…

Verilog HDL语法入门系列(二):Verilog的语言文字规则

目录 1 空白符和注释2 整数常量和实数常量3 整数常量和实数常量4 字符串&#xff08;string)5 格式符与转义符6 标识符(identifiers) 微信公众号获取更多FPGA相关源码&#xff1a; 1 空白符和注释 2 整数常量和实数常量 Verilog中&#xff0c;常量(literals)可是整数也可以是…

照片放大工具Topaz Gigapixel AI for Mac v7.1.2

Topaz Gigapixel AI软件是一款相当高效的PC端图像大小调整工具&#xff0c;更是一款能够为摄影师、设计师以及图像处理爱好者带来革命性体验的强大软件。它凭借先进的深度学习技术&#xff0c;打破了传统图像大小调整的限制&#xff0c;实现了真正意义上的无损放大和图像恢复。…

服务器硬件及RAID配置

目录 一、RAID磁盘阵列 1.概念 2.RAID 0 3.RAID 1 4.RAID 5 5.RAID 6 6.RAID 10 二、阵列卡 1.简介 2.缓存 三、创建 1.创建RAID 0 2.创建RAID 1 3.创建RAID 5 4.创建RAID 10 四、模拟故障 一、RAID磁盘阵列 1.概念 &#xff08;1&#xff09;是Redundant Array …

游戏服务器研究二:大世界的 scale 问题

这是一个非常陈旧的话题了&#xff0c;没什么新鲜的&#xff0c;但本人对 scale 比较感兴趣&#xff0c;所以研究得比较多。 本文不会探讨 MMO 类的网游提升单服承载人数有没有意义&#xff0c;只单纯讨论技术上如何实现。 像 moba、fps、棋牌、体育竞技等 “开房间类型的游戏…

调幅信号AM的原理与matlab实现

平台&#xff1a;matlab r2021b 本文知识内容摘自《软件无线电原理和应用》 调幅就是使载波的振幅随调制信号的变化规律而变化。用音频信号进行调幅时&#xff0c;其数学表达式可以写为: 式中&#xff0c;为调制音频信号&#xff0c;为调制指数&#xff0c;它的范围在(0&…

C#专题之线程

5.1 资源访问冲突问题 internal class StateObject {private int state 5;public void ChangeState(){if (state 5){state;Console.WriteLine("state: " state " 线程ID&#xff1a;" Thread.CurrentThread.ManageThreadId);}state 5;} }static void…

关于读完《额尔古纳河右岸》后的一些感受

一点废话 我本是一个喜欢读书的人&#xff0c;爱读那些有深意的书籍&#xff0c;而非现在这些《数据结构》、《LINUX 高级编程》、《编译原理》等技术性书籍。读它们时&#xff0c;我的的目的性很强&#xff0c;就是想了解它&#xff0c;思考如何运用到工作中。虽然时常也会因…

Android上编译和使用curl

1 概述 Android系统编译的时候默认是没有带curl工具的&#xff0c;但是在aosp源码中&#xff0c;却是有curl的源码包含。所以只需要编译curl&#xff0c;然后将其push到Android设备中&#xff0c;就可以使用curl命令了。 2 编译curl 这里编译curl是在整机代码环境下进行编译…

24年嘉兴市索贝进出口有限公司--信息安全实施项目

截至24年6月24日&#xff0c;oms生产环境订单数12万5673条。 索贝是一家致力于成为竹木小家具头部企业的公司&#xff0c;截至24年6月24日&#xff0c;在册员工数130人&#xff0c;产值10个亿。 由于信息安全人才和能力的缺失&#xff0c;导致部署在阿里云生产环境的系统处于…

Spring_Bean

概述 bean是一种特殊的Java类 具有私有属性和公共getter和setter方法实现了可序列化接口具有无参构造函数 简单来说&#xff0c;bean就是一个类对象 在Spring中&#xff0c;bean是由Spring的IOC容器进行管理的&#xff0c;IOC容器中存放的就是一个个Bean对象 内容 id&…

Qt添加Dialog对话框

Qt版本&#xff1a;5.12.12 1.添加【模块】 Base class&#xff1a;可以选择QDialog、QWidget、QMainWindow 会自动生成MyDialog.h和MyDialog.cpp文件以及MyDialog.ui文件&#xff0c; 2.添加代码&#xff1a; &#xff08;1&#xff09;TestDialog.h #pragma once#include…

HarmonyOS开发 - 日志打印

在程序开发过程中&#xff0c;日志输出是不可或缺的一部分。能有效的记录和分析日志数据&#xff0c;使开发人员可以更好地了解程序的运行状况、解决问题、优化性能并满足合规性要求等。 当程序出现错误或异常时&#xff0c;日志记录输出可以帮助开发人员快速定位问题发生的位置…

AIGC 在前端流式获取内容SSE

AIGC 在前端流式获取内容SSE 简介具体实现 简介 在 OpenAI 的 API 中&#xff0c;SSE 通常用于实现实时数据传输。例如&#xff0c;在聊天模型&#xff08;如 ChatGPT&#xff09;中&#xff0c;使用 SSE 可以让客户端实时接收到生成的对话内容&#xff0c;而不需要等待整个响…

React官方文档学习记录

官方文档&#xff1a;React 代办&#xff1a;组件通信的方式&#xff1b; 1 标签语法JSX 你必须闭合标签&#xff0c;如 <br />。你的组件也不能返回多个 JSX 标签。你必须将它们包裹到一个共享的父级中&#xff0c;比如 <div>...</div> 或使用空的<>…

CppInsights: 学习C++模版的神器

CppInsights&#xff1a;深入理解C代码的利器 C是一门强大而复杂的编程语言&#xff0c;其复杂性主要体现在语言的多层次抽象和丰富的语法特性上。尽管这些特性使得C能够高效地处理复杂的任务&#xff0c;但也给开发者带来了理解和调试代码的巨大挑战。CppInsights正是在这一背…

【LeetCode】每日一题:排序链表

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 解题思路 主要是归并排序&#xff0c;即分治思想&#xff0c;两个数组都有序了之后再双指针合并。这个过程当中&#xff0c;链表排序涉及到&#xff1a; 1、如何寻找到中点来二分&#xff1a;快…