解题思路
相邻合并一次,序列长度减 1。最少合并次数等于 m 减去「段和单调不减」的最多段数。
- 设 dpi 表示把前 i 个高度排完的最少合并次数,lasti 是在最优方案里最后一段的和(并列时取更短的最后一段,方便后面接新段)。
- 枚举最后一段是 hj+1+⋯+hi,需要 lastj≤ 这一段的和,转移 dpi=dpj+(i−j−1)。
- 条件 lastj+prej≤prei。对每个 j 把二元组 (dpj−j,−prej) 按键 lastj+prej 丢进树状数组,查询前缀最小值即可。
- 从左往右「尽量短地接下一截」会在 (4,1,6,6) 这类数据上多合并,不能用。