石子合并

试题描述
 
有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][n];
}
原文地址:https://www.cnblogs.com/WHYFRANK/p/4717609.html