相邻两堆才能合并,而且首尾相邻。把数组复制一倍,环上任意一段长度为 n 的区间就对应一种把环切开的方式。
区间 [i,j] 合并成一堆时,最后一次的代价是这一段石子的总和。最大代价的最优断点总是贴着左端或右端,所以只和「去掉最左一堆」「去掉最右一堆」比较。最小代价的最优断点是单调的:当前区间的断点落在两个更短区间的最优断点之间,不用把每个位置都试一遍。
有 n 堆石子围成一圈,第 i 堆有 ai 颗石子。每次把相邻的两堆合并成一堆,新堆的石子数等于原来两堆之和,这一次的代价也等于这个和。因为是一圈,第一堆和最后一堆也算相邻。把 n 堆合成一堆一共要合并 n−1 次。请输出所有合并顺序里,总代价的最小值和最大值。
只有一堆时不用合并,最小值和最大值都是 0。
第一行一个整数 n。
第二行 n 个整数 a1,a2,…,an。
1≤n≤200
1≤ai≤106
输出两个整数,依次是最小总代价和最大总代价,中间用空格隔开。
输入
4
4 5 9 4
输出
43 54
说明
最小的一种:先把首尾两个 4 合并,代价 8,再和 5 合并,代价 13,最后和 9 合并,代价 22。总代价 8+13+22=43。
最大的一种:先合并 5 和 9,代价 14,再和旁边的 4 合并,代价 18,最后和剩下的 4 合并,代价 22。总代价 14+18+22=54。
输入
1
1000000
输出
0 0
说明
只有一堆,没有合并,代价是 0。
输入
2
3 8
输出
11 11
说明
两堆只能合并一次,代价就是 3+8=11,最小值和最大值相同。
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册