1023 石子归并 V3
基准时间限制:2 秒 空间限制:131072 KB 分值: 320 难度:7级算法题

N堆石子摆成一条线。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价。计算将N堆石子合并成一堆的最小代价。
 
例如: 1 2 3 4,有不少合并方法
1 2 3 4 => 3 3 4(3) => 6 4(9) => 10(19)
1 2 3 4 => 1 5 4(5) => 1 9(14) => 10(24)
1 2 3 4 => 1 2 7(7) => 3 7(10) => 10(20)
 
括号里面为总代价可以看出,第一种方法的代价最低,现在给出n堆石子的数量,计算最小合并代价。
 
Input
  1. 1行:N2 <= N <= 50000)
  2. 2 - N + 1N堆石子的数量(1 <= A[i] <= 10000
Output
  1. 输出最小合并代价
Input示例
  1. 4
  2. 1
  3. 2
  4. 3
  5. 4
Output示例
  1. 19
  1. /*
  2. 51 nod 1023 石子归并 V3(GarsiaWachs算法)
  3.  
  4. problem:
  5. 给你n个石碓,相邻两个可以合并代价是它们的和. 求总体的最小代价
  6.  
  7. 参考:
  8. http://blog.sina.com.cn/s/blog_a825ada90101no1m.html
  9. 这博客解释不错,但仍不是很懂这个算法的原理 T T.
  10.  
  11. hhh-2016/09/05-21:14:18
  12. */
  13. #pragma comment(linker,"/STACK:124000000,124000000")
  14. #include <algorithm>
  15. #include <iostream>
  16. #include <cstdlib>
  17. #include <cstdio>
  18. #include <cstring>
  19. #include <vector>
  20. #include <math.h>
  21. #include <queue>
  22. #include <set>
  23. #include <map>
  24. #define lson i<<1
  25. #define rson i<<1|1
  26. #define ll long long
  27. #define clr(a,b) memset(a,b,sizeof(a))
  28. #define scanfi(a) scanf("%d",&a)
  29. #define scanfs(a) scanf("%s",a)
  30. #define scanfl(a) scanf("%I64d",&a)
  31. #define scanfd(a) scanf("%lf",&a)
  32. #define key_val ch[ch[root][1]][0]
  33. #define eps 1e-7
  34. #define inf 0x3f3f3f3f3f3f3f3f
  35. using namespace std;
  36. const ll mod = 1000000007;
  37. const int maxn = 50050;
  38. const double PI = acos(-1.0);
  39.  
  40. ll t[maxn];
  41. ll ans;
  42. int num;
  43. void dfs(int cur)
  44. {
  45. ll tval = t[cur-1] + t[cur];
  46. ans = ans+(ll)tval;
  47. for(int i = cur;i < num-1;i++)
  48. t[i] = t[i+1];
  49. int k;
  50. num --;
  51. for(k = cur-1;k >= 1 && t[k-1] < tval;k--)
  52. {
  53. t[k] = t[k-1];
  54. }
  55. t[k] = tval;
  56.  
  57. while(k >= 2 && t[k] >= t[k-2])
  58. {
  59. int len = num-k;
  60. dfs(k-1);
  61. k = num - len;
  62.  
  63. }
  64. }
  65.  
  66. int main(){
  67. int n;
  68. while(scanfi(n)!=EOF){
  69. // clr(t,inf);
  70. for(int i =0 ;i < n;i++)
  71. scanfi(t[i]);
  72. ans = 0;
  73. num = 1;
  74. for(int i =1;i < n;i++)
  75. {
  76. t[num ++ ] = t[i];
  77. while(num >= 3 && t[num-3] <= t[num-1])
  78. dfs(num-2);
  79. }
  80. while(num > 1) dfs(num-1);
  81. printf("%I64d\n",ans);
  82. }
  83. return 0;
  84. }

  

51 nod 1023 石子归并 V3(GarsiaWachs算法)的更多相关文章

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

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

  2. POJ 1738 石子合并2 GarsiaWachs算法

    石子合并(GarsiaWachs算法) 只能用该算法过!!! 详解看代码 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~ ...

  3. 51 Nod 1068 Bash游戏v3

    1068 Bash游戏 V3  题目来源: Ural 1180 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 有一堆石子共有N个.A B两个人轮流 ...

  4. 51 nod 1212 无向图最小生成树(Kruckal算法/Prime算法图解)

    1212 无向图最小生成树 N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树. 收起 输入 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量.(2 <= N < ...

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

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

  6. 51 Nod 1091 线段的重叠 (贪心算法)

    原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1091 思路分析:通过读题不难发现这是一道涉及贪心算法的题,刚 ...

  7. 51 NOD 1238 最小公倍数之和 V3

    原题链接 最近被51NOD的数论题各种刷……(NOI快到了我在干什么啊! 然后发现这题在网上找不到题解……那么既然A了就来骗一波访问量吧…… (然而并不怎么会用什么公式编辑器,写得丑也凑合着看吧…… ...

  8. 51 nod 1200 石子游戏V2 FWT

    放模板 #include<bits/stdc++.h> #define N 100005 using namespace std; const int p = 1000000007; in ...

  9. 51 Nod 1238 最小公倍数之和 V3 杜教筛

    题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1238 题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}l ...

随机推荐

  1. 第201621123043 《Java程序设计》第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 面向系统综合设计-图书馆管理系统或购物车 使用流与文件改造你的图书馆管理系统或购物车. 2.1 简述如何 ...

  2. fs检测文件夹状态

    var http = require("http"); var fs = require("fs"); var server = http.createServ ...

  3. django BBS

    https://github.com/triaquae/py_training/tree/master/OldboyBBS2 http://www.cnblogs.com/zhming26/p/592 ...

  4. 用greenlet实现Python中的并发

    from greenlet import greenlet def test1(): print 12 gr2.switch() print 34 def test2(): print 56 gr1. ...

  5. 关于collectionView和tableView的两种cell的出列方法的区别

    相信好多人一定会对collectionView和tableView的两种cell出列方法有所疑问,下面以UICollection为例子进行举例说明 假设我们已经创建了一个collectionView, ...

  6. Flask 学习 八 用户角色

    角色在数据库中表示 app/models.py class Role(db.Model): __tablename__='roles' id = db.Column(db.Integer,primar ...

  7. IntelliJ IDEA插件——冷门神器分享

    IntelliJ IDEA就不必介绍了,至今还能保持IDE前三的神器,如今java程序员的首选,今天介绍几款冷门但绝对是神器的IDEA插件. 前言 IDEA自不必说,IDEA插件是开发中必备的神器,相 ...

  8. css精简命名

    想写写前言啥的,发现自己是前言无能星人. 简单吐吐槽好了,来到新公司,接手公司之前的项目,我想着也就是改改bug,慢慢来吧,粗略看了看这个项目的代码,目前仅看了html和css样式的,忍不住吐血三升. ...

  9. nodeJS基于smtp发邮件

    邮件的协议smtp是tcp/ip族中的一个协议,所以我们这次考虑使用net模块来发送邮件. const net = require('net') const assert = require('ass ...

  10. maven构建spring报错org.springframework.core.NestedRuntimeException cannot be resolved.

    Error:The type org.springframework.core.NestedRuntimeException cannot be resolved. It is indirectly ...