石子合并(一)
时间限制: 1000 ms | 内存限制:65535 KB
难度: 3
- 描述
- 有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最小值。
- 输入
- 有多组测试数据,输入到文件结束。 每组测试数据第一行有一个整数n,表示有n堆石子。 接下来的一行有n(0< n <200)个数,分别表示这n堆石子的数目,用空格隔开 输出
- 输出总代价的最小值,占单独的一行 样例输入
-
31 2 3713 7 8 16 21 4 18
样例输出 -
9239
来源 - 上传者
-
#include
#include #include #include using namespace std;int dp[210][210];int a[210],sum[210];int main(){ int n; while(cin >> n) { if(!n) { break; } sum[0] = 0; for(int i=1; i<=n; i++) { cin >> a[i]; sum[i] = sum[i-1] + a[i]; dp[i][i] = 0; } for(int l=2; l<=n; l++) { for(int i=1; i<=n-l+1; i++) { int j = i + l - 1; dp[i][j] = 1e9; 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;}