石子合并(一)

来源:互联网 发布:linux u盘启动盘工具 编辑:程序博客网 时间:2024/05/18 01:08

石子合并(一)

时间限制: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

题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=737

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <vector>#include <map>#include <cmath>#include <stdlib.h>using namespace std;const double PI = acos(-1.0);const double eps = 0.1;const int MAX = 210;const int mod = 1e9+7;int dp[MAX][MAX];int a[MAX], n, sum[MAX];int main(){    while(~scanf("%d", &n))    {        memset(sum, 0, sizeof(sum));        for(int i = 1; i<=n; ++i)        {            scanf("%d", &a[i]);            sum[i] = sum[i-1]+a[i];        }        for(int l = 1; l<n; ++l)            for(int i = 1; i+l<=n; ++i)            {                int j = i+l;                dp[i][j] = mod;                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]);            }        printf("%d\n", dp[1][n]);    }}



0 0