当前位置: 首页 > article >正文

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

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],即将整个序列合并成一堆的最小成本


http://www.kler.cn/a/15988.html

相关文章:

  • Git如何简单使用
  • 【Docker】Mac安装Docker Desktop导致磁盘剩余空间较少问题如何解决?
  • github和Visual Studio
  • react+hook+vite项目使用eletron打包成桌面应用+可以热更新
  • 《鸿蒙生态:开发者的机遇与挑战》
  • 122、java的LambdaQueryWapper的条件拼接实现数据sql中and (column1 =1 or column1 is null)
  • Java Memory Model
  • 【7. ROS 中的 IMU 惯性测量单元消息包】
  • 有效日志管理在软件开发和运营中的作用
  • 某医院网络安全分析案例
  • 源码安装工具checkinstall使用
  • stable diffusion的使用
  • Windows10本地搭建网站教程 - 内网穿透发布公网访问
  • c#笔记-代码格式
  • 【MySQL】外连接查询
  • 浅谈一下布隆过滤器的设计之美
  • 【Python】实战:Python 实现前端、后端管理系统部署
  • RT-Thread GD32F4xx PWM设备驱动
  • python 离线安装pyinstaller
  • 国产ChatGPT大盘点
  • 10个必须掌握的SQL常用语句
  • Spring 管理 Bean-IOC--基于注解配置 bean
  • java实现乘法的方法
  • 在Docker上安装和运行MySQL容器(纯步骤)
  • 分部积分法习题
  • React 的源码与原理解读(九):Lanes