GarsiaWachs算法
对于一列的石子归并问题,除了朴素的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算法相关推荐
- NYOJ 737---石子归并(GarsiaWachs算法)
原题链接 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆.求 ...
- 石子合并(GarsiaWachs算法)
对于石子合并问题,有一个最好的算法,那就是GarsiaWachs算法.时间复杂度为O(n^2). 它的步骤如下: 设序列是stone[],从左往右,找一个满足stone[k-1] <= ston ...
- 石子合并问题java,石子合并问题 GarsiaWachs算法
石子合并问题 GarsiaWachs算法 目录引入 一个较为朴素的算法 GarsiaWachs算法 引入 在一个操场上摆放着一排 \(N\) 堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的 ...
- GarsiaWachs算法:石子归并问题
1023 石子归并 V3 基准时间限制:2 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2 ...
- 石子合并的GarsiaWachs算法
石子合并的GarsiaWachs算法 2010-07-28 18:55:51| 分类: 程序 |字号 订阅 石子合并(每次合并相邻的两堆石子,代价为这两堆石子的重量和,把一排石子合并为一堆,求最小代 ...
- 【BZOJ 3229】 3229: [Sdoi2008]石子合并 (GarsiaWachs算法)
3229: [Sdoi2008]石子合并 Description 在一个操场上摆放着一排N堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合 ...
- 【题解】poj1738石子合并 区间DP 加西亚瓦克斯算法
题目链接 乍一看很激动(诶辣鸡题才做过)然后n=4e4+o(n^3)=GG GarsiaWachs算法 或者四边形优化(还是GG不用搞了)(以后自己写一遍) 还可以加上个平衡树(憋说了--) step ...
- 四边形不等式优化 --算法竞赛专题解析(10)
本系列文章将于2021年整理出版,书名<算法竞赛专题解析>. 前驱教材:<算法竞赛入门到进阶> 清华大学出版社 2019.8 网购:京东 当当 作者签名书 如有建议, ...
- 石子合并问题(内含BZOJ3229 AC代码)
我们来看这样一道题目 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1].问安排怎样的合并顺序,能够使得总合并代价 ...
最新文章
- python代码需要背吗-python代码运行需要编译吗
- python下selenium模拟浏览器常见操作
- FIR数字滤波器设计——频率抽样法
- 字符串统计--对于给定的一个字符串,统计其中数字字符出现的次数。
- Linux中的ps命令
- 足疗收银系统哪个好?
- Nebula3 SDK (Apr 2009)更新内容
- 手把手教学 玩转苹果HomeKit
- Sensor Flicker (Sensor banding现象)
- Python常用字符编码
- java基础面试题题库五(传智专修学院2017级Java4班)
- vue PC端微信扫码登录
- 中文提交到git乱码_解决Git 中文乱码问题
- 使用诚龙网维PXE网克工具需注意的几点 不断更新中
- Android调用sharesdk过程及问题
- python爬虫(三)——多线程+正则匹配下载图片(wallheaven图片网站)
- ofdm系统matlab仿真论文,OFDM通信系统分析及其Simulink仿真
- jdk常用工具简要手册
- 扫雷游戏 (20 分)
- java怎么写桌面日历_极客编程日历桌面版开发笔记
热门文章
- 苹果手机投影_iPhone 11竟然升级成了浴霸,看来智能手机的未来要靠它了!
- MTK android 常用修改点
- ​​​​​​​ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry ’1′ for key
- Jenkins配置流水线
- 关于报错ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging
- 解决 IllegalArgumentException: Could not resolve placeholder in string value
- 斯坦福大学的产学研之路
- 银河系中心黑洞的第一张照片,本文带你了解发现的过程
- 学习笔记:测试抓包工具fiddler
- 超详细的R语言热图之complexheatmap系列(1)