LeetCode 题解工作台
合并石头的最低成本
有 n 堆石头排成一排,第 i 堆中有 stones[i] 块石头。 每次 移动 需要将 连续的 k 堆石头合并为一堆,而这次移动的成本为这 k 堆中石头的总数。 返回把所有石头合并成一堆的最低成本。如果无法合并成一堆,返回 -1 。 示例 1: 输入: stones = [3,2,4,1], K …
3
题型
4
代码语言
3
相关题
当前训练重点
困难 · 状态·转移·动态规划
答案摘要
我们不妨记题目中的 为 ,石头的堆数为 。 定义 表示将区间 $[i, j]$ 中的石头合并成 堆的最小成本。初始时 $f[i][i][1] = 0$,其他位置的值均为 。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路
题目描述
有 n 堆石头排成一排,第 i 堆中有 stones[i] 块石头。
每次 移动 需要将 连续的 k 堆石头合并为一堆,而这次移动的成本为这 k 堆中石头的总数。
返回把所有石头合并成一堆的最低成本。如果无法合并成一堆,返回 -1 。
示例 1:
输入:stones = [3,2,4,1], K = 2 输出:20 解释: 从 [3, 2, 4, 1] 开始。 合并 [3, 2],成本为 5,剩下 [5, 4, 1]。 合并 [4, 1],成本为 5,剩下 [5, 5]。 合并 [5, 5],成本为 10,剩下 [10]。 总成本 20,这是可能的最小值。
示例 2:
输入:stones = [3,2,4,1], K = 3 输出:-1 解释:任何合并操作后,都会剩下 2 堆,我们无法再进行合并。所以这项任务是不可能完成的。.
示例 3:
输入:stones = [3,5,1,2,6], K = 3 输出:25 解释: 从 [3, 5, 1, 2, 6] 开始。 合并 [5, 1, 2],成本为 8,剩下 [3, 8, 6]。 合并 [3, 8, 6],成本为 17,剩下 [17]。 总成本 25,这是可能的最小值。
提示:
n == stones.length1 <= n <= 301 <= stones[i] <= 1002 <= k <= 30
解题思路
方法一:动态规划(区间 DP)+ 前缀和
我们不妨记题目中的 为 ,石头的堆数为 。
定义 表示将区间 中的石头合并成 堆的最小成本。初始时 ,其他位置的值均为 。
注意到 的取值范围为 ,因此我们需要枚举 的值。
对于 ,我们可以枚举 ,将区间 拆分成两个区间 和 ,然后将 中的石头合并成 堆,将 中的石头合并成 堆,最后将这两堆石头合并成一堆,这样就可以将区间 中的石头合并成 堆。因此,我们可以得到状态转移方程:
我们将区间 的 堆石头合并成一堆,因此 ,其中 表示区间 中石头的总数。
最后答案即为 ,其中 为石头的堆数。
时间复杂度 ,空间复杂度 。其中 为石头的堆数。
class Solution:
def mergeStones(self, stones: List[int], K: int) -> int:
n = len(stones)
if (n - 1) % (K - 1):
return -1
s = list(accumulate(stones, initial=0))
f = [[[inf] * (K + 1) for _ in range(n + 1)] for _ in range(n + 1)]
for i in range(1, n + 1):
f[i][i][1] = 0
for l in range(2, n + 1):
for i in range(1, n - l + 2):
j = i + l - 1
for k in range(1, K + 1):
for h in range(i, j):
f[i][j][k] = min(f[i][j][k], f[i][h][1] + f[h + 1][j][k - 1])
f[i][j][1] = f[i][j][K] + s[j] - s[i - 1]
return f[1][n][1]
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | Depends on the final approach |
| 空间 | Depends on the final approach |
面试官常问的追问
外企场景- question_mark
Look for understanding of dynamic programming and optimization techniques like prefix sums.
- question_mark
Evaluate the candidate's ability to handle edge cases where merging is impossible.
- question_mark
Assess the candidate’s familiarity with state transitions and how it applies to minimizing cost.
常见陷阱
外企场景- error
Failing to handle the case where merging isn't possible, leading to incorrect answers.
- error
Not optimizing the prefix sum calculations, leading to excessive time complexity.
- error
Overcomplicating the DP state transitions or missing a straightforward recursive relation.
进阶变体
外企场景- arrow_right_alt
Allowing a different number of consecutive piles (e.g., changing k).
- arrow_right_alt
Solving the problem under stricter time constraints for larger inputs.
- arrow_right_alt
Extending the problem to handle multiple groups of k piles simultaneously.