2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数。找出把所有石头合并成一堆的最低成本。如果不可能,返回 -1 。

福大大 答案2021-08-24:

动态规划。
时间复杂度:O(N^2K)。
空间复杂度:O(N^2
K)。

代码用golang编写。代码如下:

package mainimport ("fmt""math"
)func main() {arr := []int{3, 2, 4, 1}k := 2ret := mergeStones1(arr, k)fmt.Println(ret)fmt.Println("--------")ret = mergeStones2(arr, k)fmt.Println(ret)
}func mergeStones1(stones []int, K int) int {n := len(stones)if (n-1)%(K-1) > 0 {return -1}presum := make([]int, n+1)for i := 0; i < n; i++ {presum[i+1] = presum[i] + stones[i]}return process1(0, n-1, 1, stones, K, presum)
}// part >= 1
// arr[L..R] 一定要弄出part份,返回最低代价
// arr、K、presum(前缀累加和数组,求i..j的累加和,就是O(1)了)
func process1(L int, R int, P int, arr []int, K int, presum []int) int {if L == R { // arr[L..R]return twoSelectOne(P == 1, 0, -1)}// L ... R 不只一个数if P == 1 {next := process1(L, R, K, arr, K, presum)if next == -1 {return -1} else {return next + presum[R+1] - presum[L]}} else { // P > 1ans := math.MaxInt64// L...mid是第1块,剩下的是part-1块for mid := L; mid < R; mid += K - 1 {// L..mid(一份) mid+1...R(part - 1)next1 := process1(L, mid, 1, arr, K, presum)next2 := process1(mid+1, R, P-1, arr, K, presum)if next1 != -1 && next2 != -1 {ans = getMin(ans, next1+next2)}}return ans}
}func twoSelectOne(c bool, a int, b int) int {if c {return a} else {return b}
}func getMin(a int, b int) int {if a < b {return a} else {return b}
}func mergeStones2(stones []int, K int) int {n := len(stones)if (n-1)%(K-1) > 0 { // n个数,到底能不能K个相邻的数合并,最终变成1个数!return -1}presum := make([]int, n+1)for i := 0; i < n; i++ {presum[i+1] = presum[i] + stones[i]}dp := make([][][]int, n)for i := 0; i < n; i++ {dp[i] = make([][]int, n)for j := 0; j < n; j++ {dp[i][j] = make([]int, K+1)}}return process2(0, n-1, 1, stones, K, presum, dp)
}func process2(L int, R int, P int, arr []int, K int, presum []int, dp [][][]int) int {if dp[L][R][P] != 0 {return dp[L][R][P]}if L == R {return twoSelectOne(P == 1, 0, -1)}if P == 1 {next := process2(L, R, K, arr, K, presum, dp)if next == -1 {dp[L][R][P] = -1return -1} else {dp[L][R][P] = next + presum[R+1] - presum[L]return next + presum[R+1] - presum[L]}} else {ans := math.MaxInt64// i...mid是第1块,剩下的是part-1块for mid := L; mid < R; mid += K - 1 {next1 := process2(L, mid, 1, arr, K, presum, dp)next2 := process2(mid+1, R, P-1, arr, K, presum, dp)if next1 == -1 || next2 == -1 {dp[L][R][P] = -1return -1} else {ans = getMin(ans, next1+next2)}}dp[L][R][P] = ansreturn ans}
}

执行结果如下:


左神java代码

2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的相关推荐

  1. 2021.08.24学习内容torch.utils.data.DataLoader以及CUDA与GPU的关系

    pytorch数据加载: ①totchvision 的包,含有支持加载类似Imagenet,CIFAR10,MNIST 等公共数据集的数据加载模块 torchvision.datasets impor ...

  2. LeetCode 1000. 合并石头的最低成本(区间DP)

    文章目录 1. 题目 2. 解题 1. 题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆 ...

  3. 【LeetCode】合并石头的最低成本 [H](动态规划)

    1000. 合并石头的最低成本 - 力扣(LeetCode) 一.题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而 ...

  4. LeetCode 1000. 合并石头的最低成本(经典区间DP)

    1000. 合并石头的最低成本 定义dp[i][j]为尽可能多的合并区间[i, j] 所需的成本,不一定能合并成一堆,但合并完成后剩下的堆数一定小于k,更具体地,剩余的堆数一定是(n - 1) % ( ...

  5. LeetCode题解(1000):合并石头的最低成本(Python)

    题目:原题链接(困难) 标签:动态规划 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O ( N 4 ) O(N^4) O(N4) O ( N 3 ) O(N^3) O(N3) ...

  6. 本博客导读(2021/08/09更新)

    文章目录 1. 简介 1.1 博客精神 1.2 写作目的 1.3 技术方向 1.4 博主 1.5 版权说明 2 推荐内容 2.1 主要代表作 2.2 其他推荐内容 3. 程序类 3.1 C#程序设计 ...

  7. C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并

    C#操作Excel文件(读取Excel,写入Excel) 看到论坛里面不断有人提问关于读取excel和导入excel的相关问题.闲暇时间将我所知道的对excel的操作加以总结,现在共享大家,希望给大家 ...

  8. H5在线CAD,网页CAD,MxDraw云图平台2022.08.24更新

    SDK开发包下载地址: MxDraw云图平台 2022.08.24更新_梦想CAD控件 1. 增加对像扩展数据功能 2. 增加CAD结合GIS使用功能 https://www.mxdraw3d.com ...

  9. JZOJ 7066. 【2021.4.24 NOI模拟】ehzeux与圆周(DP)

    JZOJ 7066. [2021.4.24 NOI模拟]ehzeux与圆周 题目大意 圆周上有2∗n2*n2∗n个点,两两相连构成nnn个点对,其中有mmm个点对已经连好,求所有方案下的连通块数量和. ...

最新文章

  1. BIEE建模 之 Administration 导入元数据时无法显示表
  2. android:sharedUserId作用
  3. Hystrix 熔断器02 —— hystrix 案例之高并发测试
  4. docker之docker-machine用法
  5. 『ACM-算法-动态规划』初识DP动态规划算法
  6. P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】
  7. 谷歌大脑发布神经架构搜索新方法:提速1000倍
  8. Guacamole-HTML5无客户端远程桌面
  9. 2014牡丹江——Hierarchical Notation
  10. Flash Builder4破解步骤
  11. mysql分组函数_mysql分组函数
  12. sim卡没坏但苹果手机无服务_苹果8PLUS换壳导致无服务维修
  13. 回归系数t检验公式_最全物理公式合集,高考这一份就够了!
  14. [数学] 一般正态曲线函数的积分怎么求?为什么总是1?
  15. 剖析Android shape标签的绘制
  16. android 优化侧滑按钮,Android 界面侧滑
  17. Android 虚拟按键与沉浸式的适配
  18. 关于流程图设计,你需要Get的几点必备知识
  19. html 设置两个标签的相对距离_HTML 让上下两个DIV之间保持一定距离或没有距离...
  20. Ubuntu布置Django项目

热门文章

  1. Linux上抓arp包,linux c arp协议分析一 - 捕捉局域网内的arp包
  2. 第一篇cnblog!
  3. win10电脑不显示手机连接服务器失败,win10连接不上手机热点的详细处理办法【图文】...
  4. 体验新理财方式:余额宝与微信理财
  5. 手机直播开发,直播程序源码,直播源码分享经验
  6. 安全机构建议奥巴马政府谨慎使用开源软件
  7. 多台设备同步 NSUserActivity详解
  8. 物联网或迎爆发式增长 爱立信加快布局窄带物联网
  9. mysql中数据库怎么建库建表
  10. win7系统用笔记本共享wifi热点 让手机免费上网