当前位置:首页 > 题解目录 > 正文内容

【题解】石子合并

亿万年的星光4个月前 (05-30)题解目录276

【题目描述】

在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。

设计一个程序,计算出将N堆石子合并成一堆的最小得分。

【输入描述】

第一行为一个正整数N (2≤N≤100);

以下N行,每行一个正整数,小于10000,分别表示第i堆石子的个数(1≤i≤N)。

【输出描述】

为一个正整数,即最小得分。

【样例输入】

7
13
7
8
16
21
4
18

【样例输出】

239



【题目分析】

1.定义状态:

设 dp[i][j] 表示合并第 i 堆到第 j 堆石子的最小得分。

为了方便计算区间和,预处理一个前缀和数组 sum,其中 sum[i] 表示前 i 堆石子的总数。


2.状态转移方程:

对于区间 [i, j],枚举最后一次合并的分割点 k(i ≤ k < j),将区间分成 [i, k] 和 [k+1, j]。

合并这两部分的得分为 sum[j] - sum[i-1](即区间 [i, j] 的石子总数)。

状态转移方程为:

dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);

3.初始化:

单个石堆不需要合并,因此 dp[i][i] = 0。

其他 dp[i][j] 初始化为一个较大值(如 INT_MAX)。


4.计算顺序:

按区间长度从小到大计算,因为长区间的结果依赖于短区间。



【参考答案】

#include <iostream>
#include <climits>
using namespace std;

const int MAX_N = 100;  // 最大石子堆数

int main() {
	int N;
	cin >> N;
	int stones[MAX_N + 1] = {0};  // 石子堆,从1开始编号
	int sum[MAX_N + 1] = {0};     // 前缀和数组
	for (int i = 1; i <= N; i++) {
		cin >> stones[i];
		sum[i] = sum[i - 1] + stones[i];
	}

	// DP表,dp[i][j]表示合并i到j堆的最小得分
	int dp[MAX_N + 1][MAX_N + 1] = {0};

	// 初始化:单个石堆不需要合并,得分为0
	for (int i = 1; i <= N; i++) {
		dp[i][i] = 0;
	}

	// 按区间长度从小到大计算
	for (int len = 2; len <= N; len++) {      // 区间长度
		for (int i = 1; i + len - 1 <= N; i++) {  // 区间起点
			int j = i + len - 1;              // 区间终点
			dp[i][j] = INT_MAX;
			for (int k = i; k < j; k++) {     // 枚举分割点
				dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
			}
		}
	}

	cout << dp[1][N] << endl;
	return 0;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

【题解】最大比例

【题目描述】X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。并且,相邻的两个级别间的比例是个固定值。也就是说:所有级别的奖金数构成了一个等比数列。比如:16,24,36,54其等比值为:3...

【题解】区间合并

【题目描述】给定n个闭区间[ai,bi],其中i=1,2,...n。任意两个相邻或相交或相邻的闭区间可以合并为一个闭区间。例如,[1,2]和[2,3]可以合并为[1,3]。[1,3]和[2,4]可以合...

因子分解

【题目描述】输入一个数,输出其素因子分解表达式。【输入描述】输入一个整数 n (2≤n<100)。【输出描述】输出该整数的因子分解表达式。表达式中各个素数从小到大排列。如果该整数可以分解出因子a...

线段

题目描述在一个数轴上有n条线段,现选取其中k条线段使得这k条线段两两没有重合部分,问最大的k为多少?输入格式第一行为一个正整数n,下面n行每行2个数字ai,bi,描述每条线段。输出格式输出文件仅包括1...

字符串反连接

【题目描述】写一函数,使输入的一个字符串按反序存放,在主函数中输入并输出反序后的字符串(不包含空格)。【输入描述】一行字符【输出描述】逆序后的字符串【样例输入】123456abcdef【样例输出】fe...

【题解—动态规划】背包问题1

【题目描述】一个旅行者有一个最多能装 m 公斤物品的背包,现在有 n 件物品,它们的重量分别是 w1,w2,…,wn, 它们的价值分别为 c1,c2,…cn 。若每种物品只有一件,求旅行者能获得的最大...