2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的
2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数。找出把所有石头合并成一堆的最低成本。如果不可能,返回 -1 。
福大大 答案2021-08-24:
动态规划。
时间复杂度:O(N^2K)。
空间复杂度:O(N^2K)。
代码用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 堆石头的相关推荐
- 2021.08.24学习内容torch.utils.data.DataLoader以及CUDA与GPU的关系
pytorch数据加载: ①totchvision 的包,含有支持加载类似Imagenet,CIFAR10,MNIST 等公共数据集的数据加载模块 torchvision.datasets impor ...
- LeetCode 1000. 合并石头的最低成本(区间DP)
文章目录 1. 题目 2. 解题 1. 题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆 ...
- 【LeetCode】合并石头的最低成本 [H](动态规划)
1000. 合并石头的最低成本 - 力扣(LeetCode) 一.题目 有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而 ...
- LeetCode 1000. 合并石头的最低成本(经典区间DP)
1000. 合并石头的最低成本 定义dp[i][j]为尽可能多的合并区间[i, j] 所需的成本,不一定能合并成一堆,但合并完成后剩下的堆数一定小于k,更具体地,剩余的堆数一定是(n - 1) % ( ...
- LeetCode题解(1000):合并石头的最低成本(Python)
题目:原题链接(困难) 标签:动态规划 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O ( N 4 ) O(N^4) O(N4) O ( N 3 ) O(N^3) O(N3) ...
- 本博客导读(2021/08/09更新)
文章目录 1. 简介 1.1 博客精神 1.2 写作目的 1.3 技术方向 1.4 博主 1.5 版权说明 2 推荐内容 2.1 主要代表作 2.2 其他推荐内容 3. 程序类 3.1 C#程序设计 ...
- C#操作Excel文件暨C#实现在Excel中将连续多列相同数据项合并
C#操作Excel文件(读取Excel,写入Excel) 看到论坛里面不断有人提问关于读取excel和导入excel的相关问题.闲暇时间将我所知道的对excel的操作加以总结,现在共享大家,希望给大家 ...
- H5在线CAD,网页CAD,MxDraw云图平台2022.08.24更新
SDK开发包下载地址: MxDraw云图平台 2022.08.24更新_梦想CAD控件 1. 增加对像扩展数据功能 2. 增加CAD结合GIS使用功能 https://www.mxdraw3d.com ...
- JZOJ 7066. 【2021.4.24 NOI模拟】ehzeux与圆周(DP)
JZOJ 7066. [2021.4.24 NOI模拟]ehzeux与圆周 题目大意 圆周上有2∗n2*n2∗n个点,两两相连构成nnn个点对,其中有mmm个点对已经连好,求所有方案下的连通块数量和. ...
最新文章
- BIEE建模 之 Administration 导入元数据时无法显示表
- android:sharedUserId作用
- Hystrix 熔断器02 —— hystrix 案例之高并发测试
- docker之docker-machine用法
- 『ACM-算法-动态规划』初识DP动态规划算法
- P3157-[CQOI2011]动态逆序对【CDQ分治,树状数组】
- 谷歌大脑发布神经架构搜索新方法:提速1000倍
- Guacamole-HTML5无客户端远程桌面
- 2014牡丹江——Hierarchical Notation
- Flash Builder4破解步骤
- mysql分组函数_mysql分组函数
- sim卡没坏但苹果手机无服务_苹果8PLUS换壳导致无服务维修
- 回归系数t检验公式_最全物理公式合集,高考这一份就够了!
- [数学] 一般正态曲线函数的积分怎么求?为什么总是1?
- 剖析Android shape标签的绘制
- android 优化侧滑按钮,Android 界面侧滑
- Android 虚拟按键与沉浸式的适配
- 关于流程图设计,你需要Get的几点必备知识
- html 设置两个标签的相对距离_HTML 让上下两个DIV之间保持一定距离或没有距离...
- Ubuntu布置Django项目