首页 > 学院 > 开发设计 > 正文

石子合并(一)

2019-11-10 17:08:06
字体:
来源:转载
供稿:网友

石子合并(一)

时间限制: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样例输出
9

239

还是有些迷迷糊糊,师兄说还可以用四边形不等式优化,还不会,以后再补充。

#include <iostream>#include <cstdio>#define INF 100000000#define N 205using namespace std;int main(){    int n,i,j;    int a[N],sum[N],dp[N][N];    while(~scanf("%d",&n)&&n)    {        sum[0]=0;        for(i=1;i<=n;i++)        {            scanf("%d",&a[i]);            dp[i][i]=0;            sum[i]=sum[i-1]+a[i];        }        //题目要求是相邻的        for(int l=2;l<=n;l++)//2,3,4堆合并        {            for(i=1;i<=n-1+1;i++)            {                j=i+l-1;                dp[i][j]=INF;                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]);    }    return 0;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表