对于一列的石子归并问题,除了朴素的O(n^3)的dp做法及其O(n^2)优化,还有GarsiaWachs算法。

算法流程是,找一个最小的k,使得a[k-1]<=a[k+1],将a[k-1]和a[k]合并;从当前位置向前找到一个最大的i,使得a[i]>a[k-1]+a[k],并将新合并的一堆移到i的后面;重复操作n-1次,直至只剩下1堆,答案就是每次合并结果累加起来。

 1 #include <cstdio>
 2
 3 const int maxn = 105, inf = 0x3f3f3f3f;
 4
 5 struct Node {
 6     int num, pre, next;
 7 } a[maxn];
 8
 9 inline void del(int x) {
10     int pp = a[a[x].pre].pre, nn = a[x].next;
11     a[pp].next = nn, a[nn].pre = pp;
12 }
13
14 inline void insert(int x, int y) {
15     a[x].pre = y, a[x].next = a[y].next;
16     a[a[y].next].pre = x, a[y].next = x;
17 }
18
19 int main() {
20     int n, ans = 0;
21     scanf("%d", &n);
22     a[0].num = a[n + 1].num = inf;
23     a[0].next = 1, a[n + 1].pre = n;
24     for (int i = 1; i <= n; ++i) {
25         scanf("%d", &a[i].num);
26         a[i].pre = i - 1, a[i].next = i + 1;
27     }
28     for (int t = 1; t <= n - 1; ++t) {
29         int x, y, sum;
30         for (int i = a[0].next; ; i = a[i].next)
31             if (a[a[i].pre].num <= a[a[i].next].num) {
32                 x = i;
33                 break;
34             }
35         sum = a[a[x].pre].num + a[x].num;
36         for (int i = a[a[x].pre].pre; ; i = a[i].pre)
37             if (a[i].num > sum) {
38                 y = i;
39                 break;
40             }
41         del(x);
42         a[x].num = sum;
43         printf("%d ttt\n", sum);
44         insert(x, y);
45         ans += sum;
46     }
47     printf("%d", ans);
48     return 0;
49 }

Code Example

转载于:https://www.cnblogs.com/Mr94Kevin/p/10926709.html

GarsiaWachs算法相关推荐

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

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

  2. 石子合并(GarsiaWachs算法)

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

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

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

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

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

  5. 石子合并的GarsiaWachs算法

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

  6. 【BZOJ 3229】 3229: [Sdoi2008]石子合并 (GarsiaWachs算法)

    3229: [Sdoi2008]石子合并 Description 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合 ...

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

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

  8. 四边形不等式优化 --算法竞赛专题解析(10)

    本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 2019.8 网购:京东 当当      作者签名书 如有建议, ...

  9. 石子合并问题(内含BZOJ3229 AC代码)

    我们来看这样一道题目 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使得总合并代价 ...

最新文章

  1. python代码需要背吗-python代码运行需要编译吗
  2. python下selenium模拟浏览器常见操作
  3. FIR数字滤波器设计——频率抽样法
  4. 字符串统计--对于给定的一个字符串,统计其中数字字符出现的次数。
  5. Linux中的ps命令
  6. 足疗收银系统哪个好?
  7. Nebula3 SDK (Apr 2009)更新内容
  8. 手把手教学 玩转苹果HomeKit
  9. Sensor Flicker (Sensor banding现象)
  10. Python常用字符编码
  11. java基础面试题题库五(传智专修学院2017级Java4班)
  12. vue PC端微信扫码登录
  13. 中文提交到git乱码_解决Git 中文乱码问题
  14. 使用诚龙网维PXE网克工具需注意的几点 不断更新中
  15. Android调用sharesdk过程及问题
  16. python爬虫(三)——多线程+正则匹配下载图片(wallheaven图片网站)
  17. ofdm系统matlab仿真论文,OFDM通信系统分析及其Simulink仿真
  18. jdk常用工具简要手册
  19. 扫雷游戏 (20 分)
  20. java怎么写桌面日历_极客编程日历桌面版开发笔记

热门文章

  1. 苹果手机投影_iPhone 11竟然升级成了浴霸,看来智能手机的未来要靠它了!
  2. MTK android 常用修改点
  3. ​​​​​​​ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry ’1′ for key
  4. Jenkins配置流水线
  5. 关于报错ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging
  6. 解决 IllegalArgumentException: Could not resolve placeholder in string value
  7. 斯坦福大学的产学研之路
  8. 银河系中心黑洞的第一张照片,本文带你了解发现的过程
  9. 学习笔记:测试抓包工具fiddler
  10. 超详细的R语言热图之complexheatmap系列(1)