石子合并

来源:互联网 发布:java实现atm机形界面 编辑:程序博客网 时间:2024/04/30 06:29
试题描述
 
有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];}


0 0
原创粉丝点击