🧱 区间DP · 合并石子

▶ 📖 问题描述 & 算法原理

合并石子问题:有 N 堆石子排成一排,每堆有 a[i] 个石子。每次可以合并相邻的两堆,合并代价为两堆石子数量之和。经过 N-1 次合并后,所有石子合并为一堆。求最小总合并代价。

输入格式:
第一行:N
第二行:a[1] a[2] ... a[N]
示例输入(6堆):
6
4 2 3 1 5 2
示例输出: 48(可自行验证)

📌 算法原理

状态定义: dp[i][j] 表示合并第 i 堆到第 j 堆的最小代价。

转移方程:
dp[i][j] = min_{i ≤ k < j} ( dp[i][k] + dp[k+1][j] + sum(i,j) )
其中 sum(i,j) 是 i..j 的石子总数。

⚠️ 为什么枚举顺序是“长度 → 起点 → 断点”?
• 长度(区间大小)在外层:保证计算大区间时,其所依赖的小区间已全部计算完成(无后效性)。
• 起点(左端点)在中间:遍历所有可能的区间起点。
• 断点(k)在最内层:在固定区间下,枚举所有可能的分割点,取最小值。

这种顺序确保了动态规划的正确性,体现了区间DP的典型特征。

🪨 石子堆 (点击数字可编辑)

📝 当前步骤 0 / 0
点击「下一步」开始演示

📊 DP 状态表(上三角)

⬜ 未计算  |  🟦 已计算  |  🔵 当前格子  |  ✅ 最终选择
🎉 最小合并代价: — 总代价: 0