3229: [Sdoi2008]石子合并

Description

在一个操场上摆放着一排N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。
试设计一个算法,计算出将N堆石子合并成一堆的最小得分。

Input

第一行是一个数N。
以下N行每行一个数A,表示石子数目。

Output

  共一个数,即N堆石子合并成一堆的最小得分。

Sample Input

4
1
1
1
1

Sample Output

8

HINT

对于 100% 的数据,1≤N≤40000

对于 100% 的数据,1≤A≤200

Source

【分析】

  额呵?奇怪的方法。。

  http://blog.csdn.net/Regina8023/article/details/45244733

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 #define Maxn 40010
 8 #define LL long long
 9
10 int a[Maxn];
11 int n,nw;
12 LL ans=0;
13
14 void merge(int k)
15 {
16     int now=a[k-1]+a[k];
17     ans+=now;
18     for(int i=k;i<nw;i++) a[i]=a[i+1];
19     nw--;
20     int j;
21     for(j=k-1;j>1&&a[j-1]<now;j--) a[j]=a[j-1];
22     a[j]=now;
23     while(j>=3&&a[j]>=a[j-2])
24     {
25         int d=nw-j;
26         merge(j-1);
27         j=nw-d;
28     }
29 }
30
31 int main()
32 {
33     scanf("%d",&n);
34     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
35     nw=1;
36     for(int i=2;i<=n;i++)
37     {
38         a[++nw]=a[i];
39         while(nw>=3&&a[nw-2]<=a[nw])
40          merge(nw-1);
41     }
42     while(nw>1) merge(nw);
43     printf("%d\n",ans);
44     return 0;
45 }

View Code

2017-02-28 21:00:08

转载于:https://www.cnblogs.com/Konjakmoyu/p/6480877.html

【BZOJ 3229】 3229: [Sdoi2008]石子合并 (GarsiaWachs算法)相关推荐

  1. 石子合并(GarsiaWachs算法)

    对于石子合并问题,有一个最好的算法,那就是GarsiaWachs算法.时间复杂度为O(n^2). 它的步骤如下: 设序列是stone[],从左往右,找一个满足stone[k-1] <= ston ...

  2. 石子合并问题java,石子合并问题 GarsiaWachs算法

    石子合并问题 GarsiaWachs算法 目录引入 一个较为朴素的算法 GarsiaWachs算法 引入 在一个操场上摆放着一排 \(N\) 堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的 ...

  3. 石子合并的GarsiaWachs算法

    石子合并的GarsiaWachs算法 2010-07-28 18:55:51|  分类: 程序 |字号 订阅 石子合并(每次合并相邻的两堆石子,代价为这两堆石子的重量和,把一排石子合并为一堆,求最小代 ...

  4. GarsiaWachs算法:石子归并问题

    1023 石子归并 V3 基准时间限制:2 秒 空间限制:131072 KB 分值: 320 难度:7级算法题  收藏  关注 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 ...

  5. 【题解】poj1738石子合并 区间DP 加西亚瓦克斯算法

    题目链接 乍一看很激动(诶辣鸡题才做过)然后n=4e4+o(n^3)=GG GarsiaWachs算法 或者四边形优化(还是GG不用搞了)(以后自己写一遍) 还可以加上个平衡树(憋说了--) step ...

  6. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子

    问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...

  7. 算法设计与分析——动态规划——石子合并问题

    1.石子合并问题 在一个圆形操场的四周摆放着n堆石子.现要将石子有序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分.设计一个算法,计算出将n堆石子合并成 ...

  8. 算法基础课-动态规划-区间dp-AcWing 282. 石子合并:区间dp

    文章目录 题目分析 题目链接 题目分析 只能合并相邻两堆.求体力最小值 数据比较弱,最多300堆,每堆重量不超过1000. 状态表示 f[i][j]表示合并区间[i,j]需要的最小体力 状态转移 把区 ...

  9. NYOJ 737---石子归并(GarsiaWachs算法)

    原题链接 描述    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求 ...

最新文章

  1. Android事件机制:事件传递和消费
  2. listalias - 列出用户和系统别名
  3. 属性名、变量名与 内部关键字 重名 加
  4. Http 持久连接与 HttpClient 连接池
  5. Redis系列教程(六):Redis缓存和MySQL数据一致性方案详解
  6. sqlsrv 过去一小时_包裹分拣神器!每小时8.6万件包裹,是整个车间人数的两倍...
  7. 网站后台发通知页面效果图
  8. python 干什么工作具有明显优势-Python 的优势在哪里?
  9. 洛谷 P2712 摄像头
  10. 配置maven的settings文件
  11. 计算机删除登录用户,Windows10账户删除怎么登陆 如何删除账户
  12. python 采用数值方法计算最速曲线
  13. Linux常用命令——newusers命令
  14. 电脑重装系统后我的电脑图标怎么添加到桌面上显示
  15. html做一个聊天输入框,js实现简易聊天对话框
  16. 侯捷C++视频资源全集 | 百度网盘下载
  17. UE4-(室外光照)距离场环境光遮蔽(DFAO)
  18. 大学生变身建筑工人:在家隔离的美国学生们,正在Minecraft中复现一座座大学校园...
  19. iphone学习(原创+搜集)
  20. 计算机毕设Python+Vue智慧工地管理系统(程序+LW+部署)

热门文章

  1. hive(3)——使用mapreduce
  2. java 1.6 webservice_java jdk1.6内置支持的webservice使用示例
  3. mysql新建用户和授权登录
  4. the value of esp was not properly saved
  5. numpy使用MKL库提升计算性能
  6. kafka集群管理工具kafka-manager
  7. 报错:“-bash: git: 未找到命令”
  8. 范围for语句的整理
  9. 等式成立JAVA_java – 找到两个线性等式成立的整数集
  10. Linux系统上的库文件的生成与使用