题目
在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选择相邻的两堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。
测试用例:
输入:
4(石子的堆数)
4 4 5 9(每一堆的石子数目)
输出:
43 54
分析:
我们知道链式的石子合并问题是相邻两堆之间可以合并,那么环形的和链式的区别就在于,环形的相当于是链式的头尾两堆也能合并
那么,我们只要解决,如何在链式的基础上更换每次头和尾的问题即可,即环形的切割点
n堆,有n个切割点,每次以区间长度为n的链式的进行求解。
如果想n个切割点,每次长度为n,那么我们创建长度为2*n的数组,存放两次石子序列即可。
最优子结构:
和链式一样,合并两堆的代价最小
即把当前的链式区间划分,左+右+合并左右 的代价达到最优即可
int f[2 * n + 1][2 * n + 1]; //计算合并的最小值 f[i][j]表示i到j这个范围内合并的代价
int g[2 * n + 1][2 * n + 1]; //计算合并的最大值 g[i][j]表示i到j这个范围内合并的代价
#include <iostream>

本文探讨了如何设计一个算法来计算在环形操场上的n堆石子通过连续合并操作获得的最小和最大得分,通过划分区间并应用动态规划方法求解最优子结构。关键步骤包括使用前缀和计算合并代价并维护最小和最大值数组。
最低0.47元/天 解锁文章
3340

被折叠的 条评论
为什么被折叠?



