力扣,合并石头最低成本算法题

1:这个题有题解,自己可以去看力扣,合并石头

2:网上也有视频自己去看视频讲解

3:下面我自己的一些理解

4:原需求:

 5:代码:使用贪心算法和最小堆来求解:

import java.util.PriorityQueue;

public class MinimumCostToMergeStones {
    public int mergeStones(int[] stones, int K) {
        int n = stones.length;
        // 如果无法合并成一堆,则返回 -1
        if ((n - 1) % (K - 1) != 0) {
            return -1;
        }

        int[] prefixSum = new int[n + 1];
        // 计算石头数量的前缀和
        for (int i = 0; i < n; i++) {
            prefixSum[i + 1] = prefixSum[i] + stones[i];
        }

        // dp[i][j][k] 表示将 i 到 j 的石头堆合并成 k 堆的最小成本
        int[][][] dp = new int[n][n][K + 1];
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        // 初始化:dp[i][i][1] = 0,dp[i][i][k] = INF (k > 1)
        for (int i = 0; i < n; i++) {
            for (int k = 2; k <= K; k++) {
                for (int j = i; j < n; j++) {
                    dp[i][j][k] = Integer.MAX_VALUE;
                }
            }
        }

        // 状态转移
        for (int len = 2; len <= n; len++) {
            for (int i = 0; i + len <= n; i++) {
                int j = i + len - 1;
                for (int k = 2; k <= K; k++) {
                    for (int p = i; p < j; p += K - 1) {
                        dp[i][j][k] = Math.min(dp[i][j][k], dp[i][p][1] + dp[p + 1][j][k - 1]);
                    }
                }
                dp[i][j][1] = dp[i][j][K] + prefixSum[j + 1] - prefixSum[i];
            }
        }

        return dp[0][n - 1][1];
    }
}

注释:

  1. 首先判断是否可以合并成一堆:如果 (n - 1) % (K - 1) != 0,则无法合并成一堆。
  2. 计算石头数量的前缀和。
  3. 初始化 dp 数组:对于所有 i,dp[i][i][1] = 0,dp[i][i][k] = INF (k > 1)。
  4. 状态转移:枚举区间长度 len,枚举左端点 i,计算右端点 j = i + len - 1。
  5. 对于 k = 2, 3, ..., K,枚举中间点 p,计算 dp[i][j][k] = dp[i][p][1] + dp[p + 1][j][k - 1]。
  6. 计算 dp[i][j][1] = dp[i][j][K] + prefixSum[j + 1] - prefixSum[i]。
  7. 返回 dp[0][n - 1][1],即将整个序列合并成一堆的最小成本

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第九章 子查询

文章目录 前言一、.需求分析与问题解决1 、实际问题2 、子查询的基本使用3 、子查询的分类 二、单行子查询1、单行比较操作符2、代码示例3、 HAVING 中的子查询4、CASE中的子查询5、 子查询中的空值问题6、非法使用子查询 三、多行子查询1、 多行比较操作符2、代码示例3 、空值…

这可能是你看过最详细的Java集合篇【二】—— LinkedList

文章目录 LinkedList继承关系数据结构变量构造方法添加元素相关方法查找元素相关方法删除元素相关方法清空方法遍历方法其它方法常见面试题 LinkedList LinkedList底层数据结构是双向链表。链表数据结构的特点是每个元素分配的空间不必连续、插入和删除元素时速度非常快、但访…

python@可变对象和不可变对象@按值传递和引用传递@python运行可视化工具

文章目录 可变对象和不可变对象&#x1f388;可视化工具&#x1f388;可变对象和idegeg变量名和内存地址&#x1f388;函数调用对参数的修改&#x1f602;Note 按值传递vs引用传递note&#x1f388;如何借助函数修改外部变量的值?Note 可变对象和不可变对象&#x1f388; 在Py…

数据库的概念?怎么在linux内安装数据库?怎么使用?

目录 一、概念 二、mysql安装及设置 1.安装mysql 2.数据库服务启动停止 三、数据库基本操作 1、数据库的登录及退出 2、数据表的操作 3、mysql查询操作 一、概念 数据库:是存放数据的仓库&#xff0c;它是一个按数据结构来存储和管理数据的计算机软件系统。数据库管理…

SQLServer的内存管理架构

内存管理架构说明 一、Windows的虚拟内存管理器二、SQL Server 内存体系结构2.1、传统&#xff08;虚拟&#xff09;内存2.2、地址窗口扩展 &#xff08;AWE&#xff09; 内存 三、从 SQL Server 2012 &#xff08;11.x&#xff09; 开始发生的改变3.1、对内存管理的更改3.2、对…

安装多个NodeJS windows上安装多个Nodejs版本 解决vue2/vue3同时运行

第一步下载nvm-windowsnvm-windows 下载地址&#xff1a;Github最新下载地址 进入之后直接下载 第二步 安装NVM 注意路径一定不要包含空格 中文否则会报错 点击安装之后 如果之前安装了nodejs的话会提示 希望nvm管理已安装node 版本吗 点击 是 即可 安装完成后 打开 cmd 输入 n…

Bito:一款 iead/webstorm 神级插件,由 ChatGPT 团队开发,堪称辅助神器

前言&#xff1a; idea(后端)&#xff0c;webstorm(前端)中可以用的一款辅助插件&#xff1a;Bito 个人尝试体验效果&#xff1a; 优点是&#xff1a;可以自动完成一些场景代码。 缺点&#xff1a;太慢了&#xff0c;大部分时间一直转圈 摘取文档&#xff1a; 什么是Bito&…

TDA4VM/VH 芯片硬件 mailbox

请从官网下载 TD4VM 技术参考手册&#xff0c;地址如下&#xff1a; TDA4VM 技术参考手册地址 概述 (Mailbox 的介绍在 TRM 的第7.1章节) Mailbox 使用邮箱中断机制实现了 VM 芯片的核间通信。 Mailbox 是集成在 NAVSS0 域下的一个外设&#xff08;NAVSS0 的说明可以查看&a…

flink on k8s提交任务

目录 相关文档前置准备构建镜像提交任务 相关文档 https://nightlies.apache.org/flink/flink-docs-release-1.13/docs/deployment/resource-providers/native_kubernetes/ 前置准备 flink的lib目录下放入两个依赖 bcpkix-jdk15on-1.68.jar bcprov-jdk15on-1.69.jar 创建用户…

CRM客户关系管理系统主要有哪些功能?

一、CRM客户管理系统是什么 客户关系管理&#xff08;Customer Relationship Management&#xff0c;简称CRM&#xff09;&#xff0c;是指企业为提高核心竞争力&#xff0c;利用相应的信息技术以及互联网技术协调企业与顾客间在销售、营销和服务上的交互&#xff0c;从而提升…

关于HTML5画布canvas的功能

一、画布的使用 1、首先创建一个画布&#xff08;canvas&#xff09; <canvas id”myCanvas” width”200” height”100” style”border:1px solid #000000”></canvas> 2、使用JavaScript来绘制图像 <script> Var cdocument.getElementByID(“myCanv…

AlgoC++第八课:手写BP

目录 手写BP前言1. 数据加载2. 前向传播3. 反向传播总结 手写BP 前言 手写AI推出的全新面向AI算法的C课程 Algo C&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程主要是手写 BP 代码 课程大纲可看下面的思维导图 1. 数据加载 我们首先来实现下MNIST…

【别再困扰于LeetCode接雨水问题了 | 从暴力法=>动态规划=>单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

用 ChatGPT 进行阅读理解题目的问答

阅读理解出题 阅读理解题是语言学习过程中一种重要的练习方式。无论语文还是英语考试中&#xff0c;阅读理解题都占有相当大的分值。ChatGPT 作为一种大语言模型&#xff0c;在处理自然语言理解任务中具有很大的优势。广大教师和学生家长们&#xff0c;都可以尝试用 ChatGPT 进…

springboot使用mybatis

扫描mapper接口的位置&#xff0c;生成代理对象 在application.properties配置数据源 测试: 在application.properties配置mybaits&#xff0c;支持驼峰命名&#xff0c;下划线 结果映射: Insert语句例子 在application.properties配置日志 更新 总结: 结果复用 ResultMap第二种…

Oracle-12c版本之后替换OCR磁盘组步骤

背景: 用户有一套Oracle12.2的RAC集群&#xff0c;在安装配置的时候&#xff0c;OCR磁盘只使用了单块磁盘external的模式&#xff0c;想替换成包含三块磁盘组成员normal模式的磁盘组 OCR磁盘组存储的对象: 在替换OCR磁盘之前&#xff0c;我们先确认需要迁移的OCR磁盘组存储的对…

五分钟学会在微信小程序中使用 vantUI 组件库

前言 我们在开发微信小程序时&#xff0c;设计和实现好用的用户界面无疑是至关重要的一步。但是微信小程序官方自带的 UI 组件库无法满足很多使用场景&#xff0c;这个时候就需要我们使用一些第三方的 UI 组件库。而 vant Weapp 作为一款优秀的前端 UI 组件库&#xff0c;可以帮…

【软件测试】项目测试—MySQL数据库操作应用场景?必会知识详全(超详细)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 数据库在软件测试…

微软的“牛头怪时刻”

2014年&#xff0c;当萨提亚纳德拉接任微软CEO时&#xff0c;他面对的是一家停滞且难以在快速发展的技术领域保持竞争优势的公司。自那以后&#xff0c;纳德拉将其重点从传统操作系统和生产力软件&#xff0c;转向云计算和人工智能&#xff0c;被认为重振了微软。​ 让我们以O…

AI思维导图来了,让活动策划更加简单!

每当有活动的时候&#xff0c;都会让策划的小伙伴绞尽脑汁&#xff01; ProcessOn一直致力于提升大家的办公效率。新增的AI功能&#xff0c;可以帮助我们一键生成思维导图、流程图。让一切变得更加简单。 没有灵感&#xff1f;没有关系。不知道怎么做&#xff0c;没有关系&a…