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 main
import (
"fmt"
"math"
)
func main() {
arr := []int{3, 2, 4, 1}
k := 2
ret := 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 > 1
ans := 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] = -1
return -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] = -1
return -1
} else {
ans = getMin(ans, next1+next2)
}
}
dp[L][R][P] = ans
return ans
}
}
执行结果如下:

2021-08-24:合并石头的最低成本。有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头。每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的的更多相关文章
- [Swift]LeetCode1000. 合并石头的最低成本 | Minimum Cost to Merge Stones
There are N piles of stones arranged in a row. The i-th pile has stones[i] stones. A move consists ...
- Leetcode1000 合并石头的最低成本 区间DP
有 N 堆石头排成一排,第 i 堆中有 stones[i] 块石头. 每次移动(move)需要将连续的 K 堆石头合并为一堆,而这个移动的成本为这 K 堆石头的总数. 找出把所有石头合并成一堆的最低成 ...
- 区间DP(力扣1000.合并石头的最低成本)
一.区间DP 顾名思义区间DP就是在区间上进行动态规划,先求出一段区间上的最优解,在合并成整个大区间的最优解,方法主要有记忆化搜素和递归的形式. 顺便提一下动态规划的成立条件是满足最优子结构和无后效性 ...
- 2021.08.01 P4311 数字序列(左偏树)
2021.08.01 P4311 数字序列(左偏树) [P4331 BalticOI 2004]Sequence 数字序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1 ...
- 2021.08.05 P2168 荷马史诗(哈夫曼树模板)
2021.08.05 P2168 荷马史诗(哈夫曼树模板) [P2168 NOI2015] 荷马史诗 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.k叉哈夫曼树如果子结 ...
- 【LeetCode】23. Merge k Sorted Lists 合并K个升序链表
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:合并,链表,单链表,题解,leetcode, 力扣,Py ...
- 2021.08.30 前缀函数和KMP
2021.08.30 前缀函数和KMP KMP算法详解-彻底清楚了(转载+部分原创) - sofu6 - 博客园 (cnblogs.com) KMP算法next数组的一种理解思路 - 挠到头秃 - 博 ...
- 2021.08.16 P1260 工程规划(差分约束)
2021.08.16 P1260 工程规划(差分约束) 重点: 1.跑最短路是为了满足更多约束条件. P1260 工程规划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 造 ...
- 2021.08.16 P1078 文化之旅(最短路)
2021.08.16 P1078 文化之旅(最短路) 题意: n个地,k个信仰,每个地都有自己的信仰,信仰之间会相互排斥,同信仰之间也会相互排斥,有m条路,问从s到t的最短距离是多少? 有一位使者要游 ...
- 2021.08.16 P1300 城市街道交通费系统(dfs)
2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...
随机推荐
- 【LuckyFrame研究】环境准备
LuckyFrame官方使用手册:http://www.luckyframe.cn/book/yhsc/syschyy-24.html LuckyFrame在码云平台或是GitHub上都是分成二个项目 ...
- 人脸关键点的应用场景及重难点解析丨Dev for Dev 专栏
本文为「Dev for Dev 专栏」系列内容,作者为声网视频组 AI 算法工程师 周世付. 人脸检测.人脸关键点检测,是计算机视觉的基础算法.许多酷炫应用背后,例如美颜.贴纸.人脸驱动 avatar ...
- MATLAB信号处理常用函数(转载)
https://shimo.im/docs/YyRXY8cQdqY8RJvc/ <MATLAB信号处理工具箱>,可复制链接后用石墨文档 App 或小程序打开 嗯这个肯定是随便看看,有个印象 ...
- 组合计数中的q-模拟 q analog
拒绝更新,深度和广度上建议看这个pdf URL里面用到的一些query-string过期了,,, 论文题目是 THE q-SERIES IN COMBINATORICS; PERMUTATION ST ...
- java 面向对象 --static
java 面向对象 --static package charpter5.Demo09; //static public class Student { private static int age; ...
- 【牛客小白月赛69】题解与分析A-F【蛋挞】【玩具】【开题顺序】【旅游】【等腰三角形(easy)】【等腰三角形(hard)】
比赛传送门:https://ac.nowcoder.com/acm/contest/52441 感觉整体难度有点偏大. 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通 ...
- 动手造轮子自己实现人工智能神经网络(ANN),解决鸢尾花分类问题Golang1.18实现
人工智能神经网络( Artificial Neural Network,又称为ANN)是一种由人工神经元组成的网络结构,神经网络结构是所有机器学习的基本结构,换句话说,无论是深度学习还是强化学习都是基 ...
- 用BingGPT写一首勉励自己的诗
觉得写的还挺有意思,所以记录一下,祝自己在今后的生活中努力学习,学有所成 勤学不辍志,博览群书知. 海纳百川理,山高自有路. 勿以时日长,惟以功夫深.
- 看我如何用定值 Cookie 实现反爬
摘要:本次案例,用定值Cookie实现反爬. 本文分享自华为云社区<我是怎么用一个特殊Cookie,限制住别人的爬虫的>,作者: 梦想橡皮擦 . Cookie 生成 由于本案例需要用到一个 ...
- app稳定性测试-iOS篇
稳定性测试:测试应用程序在长时间运行过程中是否存在内存泄漏.崩溃等问题,以确保应用程序具有较高的稳定性和可靠性. 对于安卓端,官方提供了很好的稳定性测试工具:monkey. 相比较而言,iOS则没有, ...