石子合并
2015-08-10 12:07
387 查看
试题描述 |
有N堆石子排成一排,每次可以将相邻的两堆合并为一堆,代价为两堆石子的总质量,合并后仍然在原来的位置。求把这N堆石子合并成一堆所需的最小总代价。 |
输入 |
第一行,一个整数N。 第二行,N个整数,表示每堆石子的质量。 |
输出 |
一行,一个整数,表示最小总代价。 |
输入示例 |
3 1 2 3 |
输出示例 |
9 |
其他说明 |
1<=N<=100,每堆石子的质量均不超过1000。 |
#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]
;
}