acwing 282. 石子合并

设有N堆石子排成一排,其编号为1,2,3,…,N。

每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。

每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。

#include<bits/stdc++.h>
#define N 1000
#define ll long long
using namespace std;
int  a[N];
int  b[N][N],sum[N];
int n;
int main()
{
    scanf("%d",&n);
    memset(b,0x3f,sizeof(b));
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)
        sum[i]=sum[i-1]+a[i],b[i][i]=0;
    for(int l=2;l<=n;l++)
        for(int i=1;i<=n-l+1;i++)
        {
            int j=l+i-1;
            for(int k=i;k<j;k++)
                b[i][j]=min(b[i][j],b[i][k]+b[k+1][j]);
            b[i][j]+=sum[j]-sum[i-1];
        }
    cout<<b[1][n];
    return 0;
}

2020年12月18日15:45:13

posted @ 2020-12-18 15:45  君与  阅读(45)  评论(0编辑  收藏  举报