合并石头的最低成本问题
字数 1063 2025-11-12 03:35:13

合并石头的最低成本问题

问题描述
有 N 堆石头排成一排,第 i 堆有 stones[i] 块石头。每次操作需要将连续的 K 堆石头合并为一堆,这次操作的代价是这 K 堆石头的总数。找出把所有石头合并成一堆的最低成本。如果无法合并成一堆,返回 -1。

问题分析
这是一个典型的区间动态规划问题。我们需要考虑如何将大区间分解为小区间进行合并,并找到最优的合并顺序。

解题步骤

  1. 可行性检查
    首先检查是否可能合并成一堆。每次合并减少 (K-1) 堆石头,从 N 堆到 1 堆需要减少 (N-1) 堆。因此需要满足:(N-1) % (K-1) == 0

  2. 前缀和数组
    创建前缀和数组 prefix,其中 prefix[i] 表示前 i 堆石头的总重量,用于快速计算任意区间的石头总数。

  3. 状态定义
    定义 dp[i][j] 表示将区间 [i, j] 内的石头合并到不能再合并时的最小成本。

  4. 状态转移
    对于区间 [i, j]:

    • 如果区间长度 len = j-i+1 < K,无法合并,dp[i][j] = 0
    • 否则,考虑所有可能的分割点 m,将区间分为 [i, m] 和 [m+1, j]
    • 当 (len-1) % (K-1) == 0 时,说明整个区间可以合并成一堆,此时需要加上整个区间的石头总数
    • 状态转移方程:dp[i][j] = min(dp[i][m] + dp[m+1][j]),如果可合并则加上 prefix[j+1]-prefix[i]
  5. 初始化

    • dp[i][i] = 0(单堆石头不需要合并)
    • 其他位置初始化为一个较大值
  6. 计算顺序
    按区间长度从小到大计算,确保计算大区间时所有小区间都已计算完成。

示例演示
考虑 stones = [3,2,4,1], K = 2

  1. 可行性:(4-1) % (2-1) = 3 % 1 = 0,可行
  2. 前缀和:[0,3,5,9,10]
  3. 计算过程:
    • 长度2:[0,1]成本=5, [1,2]成本=6, [2,3]成本=5
    • 长度3:[0,2]成本=min(5+6, 0+5)+9=14, [1,3]成本=min(6+5, 0+5)+10=15
    • 长度4:[0,3]成本=min(14+5, 5+5, 0+15)+10=20

复杂度分析

  • 时间复杂度:O(N³)
  • 空间复杂度:O(N²)

关键点

  • 只有当区间长度满足特定条件时才能合并成一堆
  • 分割点的步长可以优化为 K-1 的倍数
  • 前缀和数组用于快速计算区间和
合并石头的最低成本问题 问题描述 有 N 堆石头排成一排,第 i 堆有 stones[ i ] 块石头。每次操作需要将连续的 K 堆石头合并为一堆,这次操作的代价是这 K 堆石头的总数。找出把所有石头合并成一堆的最低成本。如果无法合并成一堆,返回 -1。 问题分析 这是一个典型的区间动态规划问题。我们需要考虑如何将大区间分解为小区间进行合并,并找到最优的合并顺序。 解题步骤 可行性检查 首先检查是否可能合并成一堆。每次合并减少 (K-1) 堆石头,从 N 堆到 1 堆需要减少 (N-1) 堆。因此需要满足:(N-1) % (K-1) == 0 前缀和数组 创建前缀和数组 prefix,其中 prefix[ i ] 表示前 i 堆石头的总重量,用于快速计算任意区间的石头总数。 状态定义 定义 dp[ i][ j] 表示将区间 [ i, j ] 内的石头合并到不能再合并时的最小成本。 状态转移 对于区间 [ i, j ]: 如果区间长度 len = j-i+1 < K,无法合并,dp[ i][ j ] = 0 否则,考虑所有可能的分割点 m,将区间分为 [ i, m] 和 [ m+1, j ] 当 (len-1) % (K-1) == 0 时,说明整个区间可以合并成一堆,此时需要加上整个区间的石头总数 状态转移方程:dp[ i][ j] = min(dp[ i][ m] + dp[ m+1][ j]),如果可合并则加上 prefix[ j+1]-prefix[ i ] 初始化 dp[ i][ i ] = 0(单堆石头不需要合并) 其他位置初始化为一个较大值 计算顺序 按区间长度从小到大计算,确保计算大区间时所有小区间都已计算完成。 示例演示 考虑 stones = [ 3,2,4,1 ], K = 2 可行性:(4-1) % (2-1) = 3 % 1 = 0,可行 前缀和:[ 0,3,5,9,10 ] 计算过程: 长度2:[ 0,1]成本=5, [ 1,2]成本=6, [ 2,3 ]成本=5 长度3:[ 0,2]成本=min(5+6, 0+5)+9=14, [ 1,3 ]成本=min(6+5, 0+5)+10=15 长度4:[ 0,3 ]成本=min(14+5, 5+5, 0+15)+10=20 复杂度分析 时间复杂度:O(N³) 空间复杂度:O(N²) 关键点 只有当区间长度满足特定条件时才能合并成一堆 分割点的步长可以优化为 K-1 的倍数 前缀和数组用于快速计算区间和