P1880 石子合并

题目描述

在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。

试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.

输入输出格式

输入格式:
数据的第1行试正整数N,1≤N≤100,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.

输出格式:
输出共2行,第1行为最小得分,第2行为最大得分.

输入输出样例

输入样例#1:
4
4 5 9 4
输出样例#1:
43
54

TJ:
这里写图片描述

数据开大一点就好了。额,汗~

#include<iostream>
#include<cstdio>
#include<cstring>
#define INF 0x7fffffff
using namespace std;
long long n,a[1005],f[1005][1005],sm[1005],s[1005][1005],ans1=INF,ans2=-INF;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);//可以不写成数组形式 
        sm[i]=sm[i-1]+a[i];
    }
    for(int i=n+1;i<=2*n-1;i++)
    {
        a[i]=a[i-n];
        sm[i]=sm[i-1]+a[i];
    }
    for(int t=2;t<=2*n-1;t++)//区间,从2开始
    {
        for(int i=1;i<=2*n-1;i++)//起点 
        {

            int j=i+t-1;//终点
            f[i][j]=INF;
            if(j<=2*n-1)
                for(int k=i;k<=i+t-2;k++)//下面有个k+1 
                {
                    f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sm[j]-sm[i-1]); 
                }
        }
    }
    for(int i=1;i<=2*n-1;i++)
        ans1=min(ans1,f[i][i+n-1]);
    cout<<ans1<<endl;


    for(int t=2;t<=2*n-1;t++)//区间 
    {
        for(int i=1;i<=2*n-1;i++)//起点 
        {   
            int j=i+t-1;//终点 
            f[i][j]=-INF;
            if(j<=2*n-1)
                for(int k=i;k<=i+t-2;k++)//下面有个k+1 
                {
                    f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+sm[j]-sm[i-1]); 
                }
        }
    }
    for(int i=1;i<=2*n-1;i++)
        ans2=max(ans2,f[i][i+n-1]);
    cout<<ans2<<endl;//开始写成了cout<<f[1][2*n-1] 
}

in:
78
4 4 10 13 7 1 16 7 0 7 19 7 9 14 18 1 5 17 1 8 11 19 15 18 11 12 2 3 7 1 13 0 17 10 2 5 1 7 1 10 7 0 12 10 9 10 9 18 11 11 7 8 6 10 7 18 1 11 2 3 18 9 17 17 10 14 16 1 4 7 1 5 11 3 13 17 7 0
out:
4084
28949

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值