算法提高 合并石子
时间限制:2.0s 内存限制:256.0MB
问题描述
在一条直线上有n堆石子,每堆有一定的数量,每次可以将两堆相邻的石子合并,合并后放在两堆的中间位置,合并的费用为两堆石子的总数。求把所有石子合并成一堆的最小花费。
输入格式
输入第一行包含一个整数n,表示石子的堆数。
接下来一行,包含n个整数,按顺序给出每堆石子的大小 。
输出格式
输出一个整数,表示合并的最小花费。
样例输入
5
1 2 3 4 5
样例输出
33
数据规模和约定
1<=n<=1000, 每堆石子至少1颗,最多10000颗。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] a = new int[1010];
int[][] temp = new int[1010][1010];
int[][] dp = new int[1010][1010];
for (int i=1; i<=n; i++) {
a[i] = in.nextInt();
temp[i][i] = a[i];
}
for (int i=1; i<n; i++) {
for(int j=i+1; j<=n; j++) {
temp[i][j] = temp[i][j-1] + a[j];
}
}
for (int r=2; r<=n; r++) {
for (int i=1; i<=n-r+1; i++) {
int j=i+r-1;
dp[i][j] = Integer.MAX_VALUE;
for (int k=i; k<j; k++) {
if(dp[i][j] > dp[i][k] + dp[k+1][j])
dp[i][j] = dp[i][k] + dp[k+1][j];
}
dp[i][j] += temp[i][j];
}
}
System.out.println(dp[1][n]);
}
}
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
(1)定义一个n*n的数组A来存储合并石子的最小合并方式,由一开始的只有两堆石子要合并慢慢向上递归得到n堆石子合并的最小得分。 (2)定义另一个于A同秩的矩阵B来存储各个合并中间的剖分 */
实现3-3石子合并问题.cpp
《算法设计与分析:石子合并问题》 石子合并问题是一个典型的动态规划问题,它源于实际生活中的操作,如游戏或资源优化等场景。在这个问题中,我们面临一个圆形操场上的n堆石子,目标是通过相邻两堆石子的合并,...
### 石子合并问题解析 #### 问题背景与定义 在一个圆形操场的四周摆放着n堆石子(n ≤ 100)。现要将这些石子有序地合并成一堆。按照规则,每次只能选择相邻的两堆石子进行合并,并且合并后的新堆石子数量作为此次...
首先,我们需要理解合并石子的过程实际上是在构建一棵由石子堆构成的树形结构,其中树的根节点代表最终合并成的一堆石子,而叶子节点则代表初始的石子堆。每一条从叶子节点到根节点的路径上的权值之和就是一种可能的...
### 石子合并问题分析与Java实现 #### 一、问题背景及定义 在一个圆形操场的四周摆放着\( n \)堆石子。任务是将这些石子有序地合并成一堆。每次只能选择两堆相邻的石子进行合并,新合并的一堆石子数为这两堆石子数...
针对石子合并问题,本文利用动态规划算法寻求石子合并时的最大,最小得分,选择相邻的两堆石子堆进行合并,其最终花费的代价与石子堆的排列顺序有关。根据其重叠子问题建立状态转移方程,利用程序进行求解。算例结果...
动态规划算法在石子合并问题中的应用 动态规划算法是一种非常重要的算法思想,它可以解决很多复杂的问题。石子合并问题是动态规划算法的一个经典应用场景。在这个问题中,我们需要将一些石子合并成一个大的石子,以...
石子合并问题可运行Java源码,下载到Eclipse就可以运行了。 要求在工程根目录下有input.txt文件,结果output.txt会生成在相同目录下
在这个“算法-动态规划- 区间 DP- 石子合并三讲(包含源程序)”的压缩包中,我们将深入探讨一种特殊的动态规划方法——区间动态规划(Interval Dynamic Programming, IDP),并结合石子合并问题进行解析。...
= 100),现要将石子有次序地合并成一堆.规定每次只能选取相邻的两堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.编一程序,由文件读入堆栈数N及每堆栈的石子数(<=20)。 (1)选择一种合并石子的方案,...
《算法-石子合并问题--直线版(Hrbust-1818)》 石子合并问题,作为计算机科学中的一个经典算法题目,主要涉及动态规划、贪心策略和数据结构等核心概念。该问题通常出现在算法竞赛或面试中,用于测试程序员解决问题...
标题中的“石子合并”是算法问题的一种,源自在线编程平台洛谷上的P1880题目。这类问题通常涉及到数据结构和算法的运用,旨在训练和提升编程者解决复杂问题的能力。在这个问题中,我们可以预想是关于优化操作顺序或...
规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。试设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 例如,图1所示的4堆石,每堆石子数(从最上面的一堆数起...
《算法-取石子游戏(信息学奥赛一本通-T1218)》这个压缩包文件中的主题是关于信息学奥赛中的一个经典问题——取石子游戏。这是一个涉及策略和逻辑思维的数学游戏,通常出现在编程竞赛或算法训练中,旨在锻炼参赛者...
在本课程设计中,我们探讨的是“C/C++实现石子合并”这一经典算法问题。这个问题通常被用来考察程序员对数据结构和算法的理解,以及如何有效地解决实际问题的能力。在这个圆形操场上的问题中,我们可以将其想象为有...
在这个问题中,我们假设有一系列石子堆,目标是通过一系列合并操作使得所有石子堆合并成一个堆,每次合并操作可以从任意两个石子堆中取出石子,并将它们合并到一个新堆中,代价是两堆石子数量之差的绝对值。...
《CP101-11石子试验作业指导书》是一个关于建筑工程中碎石或卵石质量检测的重要文档,主要用于确保建筑材料的质量,从而保证混凝土和其他结构的稳定性。这份指导书详细规定了各种实验的步骤、所需的设备和样本数量,...
每次只能选择两堆相邻的石子合并成新的一堆,并将新的一堆石子的数量作为该次合并的得分。目标是设计一个算法,计算出将n堆石子合并成一堆的最小得分和最大得分。 #### 输入输出格式 - **输入**:输入包含多组测试...