那位大佬能帮帮蒟蒻
  • 板块学术版
  • 楼主苏22
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/10/1 07:59
  • 上次更新2023/11/4 05:16:36
查看原帖
那位大佬能帮帮蒟蒻
513253
苏22楼主2021/10/1 07:59

题目 合并石子 (Standard IO) 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 题目描述 设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=100)。每堆沙子有一定的数量。现要将N堆沙子并成为一堆。合并的过程只能每次将相邻的两堆沙子堆成一堆,每次合并代价是两堆石子数量之和,这样经过N-1次归并后成为一堆。找出一种合理的归并方法,使总的代价最小。

输入 输入由若干行组成,第一行有一个整数,n(1≤n≤100);表示沙子堆数。第2至m+1行是每堆沙子的数量。

输出 一个整数,归并的最小代价。

样例输入 7 13 7 8 16 21 4 18

样例输出 239

#include<cstdio>
#include<algorithm>
using namespace std;
int n,s[100][100],a[100],f[100][100];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        s[i][i]=a[i];
    }
    for(int l=2;l<=n;l++)
    {
        for(int i=1;i+l<=n;i++)
        {
            int j=i+l;
            for(int k=i;k<=j;k++)
            {
                s[i][j]=s[i][k]+s[k+1][j];
                f[i][j]=min(f[i][j],f[i][k]+f[k+1][j])+s[i][j];
            }
        }
    }
    printf("%d",f[1][n]);
}

输出是292

2021/10/1 07:59
加载中...