动态规划入门 合并石子 COGS1660 石子合并

本文介绍了一种关于合并石子堆以获得最大得分的算法。该算法通过动态规划解决了一个圆形操场上的N堆石子合并问题,目的是找到一种顺序使得合并过程中的总得分最大。

1660. 石子合并(加强版)

★★   输入文件:stone3.in   输出文件:stone3.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

 

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

 

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

 

【输入格式】

数据的第1行试正整数N,1≤N≤2000,表示有N堆石子.第2行有N个数,分别表示每堆石子的个数.

【输出格式】

输出共1行,最大得分

【样例输入】

4

4 4 5 9

【样例输出】

54

【提示】

注意数据范围。

【来源】

HZOI2014

 

注意范围......

题解观摩chy http://blog.youkuaiyun.com/sdfzchy/article/details/70990830

 

贴代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int in,f[4010][4010],sum[4010];
 8 int ans,n;
 9 int main(){
10     scanf("%d",&n);
11     for(int i=1;i<=n;i++) scanf("%d",&in),sum[i]=sum[i-1]+in;
12     for(int i=1;i<=n;i++) sum[i+n]=sum[i]+sum[n]; 
13     ans=0x80000000;
14     for(int i=2;i<=n;i++)
15         for(int s=1;s<=2*n-i+1;s++){
16             int e=i+s-1;
17             f[s][e]=max(f[s+1][e],f[s][e-1]);
18             f[s][e]+=sum[e]-sum[s-1];
19         }
20     for(int i=1;i<=n;i++) ans=max(ans,f[i][i+n-1]);
21     printf("%d",ans);
22     return 0;
23 } 

 

转载于:https://www.cnblogs.com/sdfzxh/p/6808572.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值