您的位置:首页 > 编程语言 > C语言/C++

石子合并

2015-08-10 12:07 387 查看
试题描述
 
有N堆石子排成一排,每次可以将相邻的两堆合并为一堆,代价为两堆石子的总质量,合并后仍然在原来的位置。求把这N堆石子合并成一堆所需的最小总代价。
输入
第一行,一个整数N。

第二行,N个整数,表示每堆石子的质量。
输出
一行,一个整数,表示最小总代价。
输入示例
3

1 2 3

输出示例
9

其他说明
1<=N<=100,每堆石子的质量均不超过1000。
C++程序:

#include <cstdio>
#include <iostream>

using namespace std;

int n;
int s[105];
int a[105];
int js[105][105];

int main(){
cin >> n;
memset(js, 1, sizeof(js));
for(int i = 1; i <= n; ++i){
cin >> s[i];
a[i] = a[i - 1] + s[i];
js[i][i] = 0;
}
for(int i = 1; i <= n - 1; ++i){
for(int j = 1; j <= n - i; ++j){
for(int k = j; k <= j + i - 1; ++k){
js[j][i + j] = min(js[j][i + j], js[j][k] + js[k + 1][i + j] + a[i + j] - a[j - 1]);
}
}
}
cout << js[1]
;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息