环形合并石子

【题目描述】

在一个圆形操场的四周摆放N堆石子(N≤100),现要将石子有次序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。编一程序,读入堆数N及每堆石子数(≤100)选择一种合并石子的方案,分别得到合并这N堆石子为一堆,可以得到的最大得分和最小得分

【输入描述】

输入包含多个例子。第一行为N,即石子堆的数目,以下一行为N个整形,分别代表每堆石子的数目。当N=0时,输入结束。

【输出描述】

对每个例子,输出其最小得分和最大得分,这两个数值以空格间隔开,每个例子占一行。

【输入样例】

6

30 35 15 5 10 20

3

1 2 3333

6

3 4 5 6 7 8

0

【输出样例】

275 475

3339 6671

84 125

时间: 2024-08-06 14:44:55

环形合并石子的相关文章

合并石子大总结

合并石子大总结 石子合并问题是最经典的DP问题.首先它有如下3种题型: 一.非相邻两堆石子合并 有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量.求将这N堆石子合并成一堆的总花费最小(或最大). 分析:当然这种情况是最简单的情况,合并的是任意两堆,直接贪心即可,每次选择最小的两堆合并.本问题实际上就是哈夫曼的变形. 二.直线型相邻两堆石子合并 有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动相邻的2堆石子合并,合并花

合并类动态规划,石子归并,合并石子解题报告

石子归并问题 1:任意版 有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为将的一堆石子的数量.设计一个算法,将这N堆石子合并成一堆的总花费最小(或最大). 此类问题比较简单,就是哈夫曼编码的变形,用贪心算法即可求得最优解.即每次选两堆最少的,合并成新的一堆,直到只剩一堆为止.证明过程可以参考哈夫曼的证明过程. 2.链式归并 问题描述 设有N堆沙子排成一排,其编号为1,2,3,-,N(N<=100).每堆沙子有一定的数量.现要将N堆沙子并成为一堆.归并的

合并石子 区间dp水题

合并石子 链接: nyoj 737 描述: 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值. tags:最基本的区间dp,这题范围小,如果n大一些,还是要加个平行四边行优化. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring&g

NYOJ 737 合并石子(一)

石子合并(一) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述     有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求出总的代价最小值. 输入 有多组测试数据,输入到文件结束. 每组测试数据第一行有一个整数n,表示有n堆石子. 接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 输出 输出总代价的最小值,

合并石子 四边形不等式优化

题目描述 有一排石子,共n 堆.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.试设计一个算法,计算出将n堆石子合并成一堆的最小得分. 题解 首先由直接动态规划的方法来做,即 for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) for(int k=i;k<=j;k++) { f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+cost[j]-cost[i-1]);

蒟蒻吃药计划-治疗系列 #round 2 合并石子+乘积最大

1.合并石子 <信息学奥赛一本通>第五版 P371 第三节 T1 我就直接开始讲吧: Warning:这个题目和 合并果子 不一样!不一样!不一样!不一样!不一样!不一样!不一样!不一样! :我想告诉你一个事情,你帮帮我好么? (内心:mmp怎么又是这个人) :昨天我去商场的时候,钱包被偷了,银行卡啥的都没了,你能帮帮我么? (内心:凭啥,我就不帮) :如果你帮我找到的话,我给你50金币好不好? (*听到这句话,你充满了决心) 好吧,那我们帮帮他吧,让我们先看看他遇到了什么问题 :那个小偷在我

【四边形不等式】COGS1658- [HZOI 2014] 合并石子

[题目大意] 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得. [思路] 设 dp[i][j] 表示第 i 到第 j 堆石子合并的最优值,sum[i][j] 表示第 i 到第 j 堆石子的总数量. 1 #include<iostream> 2 #include<cstdio> 3 using namespace std;

合并石子

这一类问题都是属于动态规划问题.由最开始的任意取两堆石子来获取总数的最小值(最大值),到仅仅只能对相邻两个量进行操作,到最终的环形结构,里面蕴含着很多不同的思想,也有很多种不同的解决方案. 在这里,第一类问题解决起来思路相对简单,每次取两个最小值相加即可.当然,取值的过程中要自己注意方法,别超过了时间复杂度. 对于第二类的通解即为找到动态规划的表达式,然后通过表达式求解.这里还看见另外一种很好的解法,值得学习:参考链接

NOI 1995 合并石子 区间DP

题目 题目描述 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分. 试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分. 输入输出格式 输入格式: 数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数. 输出格式: 输出共2行,第1行为最小得分,第2行为最大得分. 输入输出样例 输入样例#1: 4 4 5 9 4 输出样例#1: 43 54 分析