【单选】有 5 堆石子排成一行,重量依次为 4、1、3、2、5。每次只能把相邻的两堆合并成一堆,代价为这两堆重量之和。将所有石子合并成一堆的最小总代价是( )。
相邻两堆合并是区间 DP 的经典模型:dp[i][j] = 把 a[i..j] 合并成一堆的最小代价,转移为 dp[i][j] = min(dp[i][k] + dp[k+1][j]) + sum(i..j)。长度从 2 推到 5,逐层填表即可。
用贪心"每次合并最小的两堆"(那适用于"任意两堆可合并"的哈夫曼模型,本题只能合并相邻两堆,贪心会出错);也容易漏加区间和 sum(i..j) 这一项。
本题考查区间动态规划(相邻石子合并问题)。
设 dp[i][j] = 把第 i 堆到第 j 堆合并成一堆的最小总代价,sum(i, j) = a[i] + … + a[j]。
dp[i][j] = min{ dp[i][k] + dp[k+1][j] } + sum(i, j)(i ≤ k < j) dp[i][i] = 0
含义:先把 [i..k] 和 [k+1..j] 各自合并成一堆(代价 dp[i][k] + dp[k+1][j]),再合并这两堆(代价为本区间总重 sum(i,j))。
数组 a = [4, 1, 3, 2, 5],前缀和:s₀=0, s₁=4, s₂=5, s₃=8, s₄=10, s₅=15
长度 2(dp = 两数之和)
| 区间 | 值 |
|---|---|
| [1,2] | 4+1 = 5 |
| [2,3] | 1+3 = 4 |
| [3,4] | 3+2 = 5 |
| [4,5] | 2+5 = 7 |
长度 3
长度 4
长度 5(答案)
答案 C(34)。
k = 3 对应:先合并 [1..3](4,1,3,代价 12)与 [4..5](2,5,代价 7),最后合并两大堆(代价 15)→ 总计 12 + 7 + 15 = 34 ✓