3229: [Sdoi2008]石子合并

时间限制: 3 Sec  内存限制: 128 MB
提交: 497  解决: 240
[提交][][]

题目描述

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

输入

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

输出

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

 

样例输入

4
1
1
1
1

样例输出

8

提示

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

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


接下来是嘴巴时间!!


po1:

  显然如果数据范围变小这可是一道DP入门题:f[i][j]=min(f[i][j],f[i][k]+f[k+1][j]+sum(i,j)) (i,j表示的是区间[i,j]的最优解,i<=k<j)
  O(N^3)!
 
po2:
  为了降低复杂度
  介绍四边形优化
  设s(i,j)为f[i][j]为最优解时k的值,假设我们已经知道四边形优化是这样的s(i,j-1)<=s(i,j)<=s(i+1,j){我是不会证明的}那么在循环k的时候我们就只用从s(i,j-1)循环到(s+1,j)了,这是近乎于O(1)的。
  O(N^2)!! 但是数组无法滚动会卡掉空间QAQ
 
po3:
  GarsiaWachs!
  这是专门用于解决石子合并类问题的算法:一个序列是A[0..n-1],每次寻找最小的一个满足A[k-1]<=A[k+1]的k,(方便起见设A[-1]和A[n]等于正无穷大)那么我们就把A[k]与A[k-1]合并,之后找最大的一个满足A[j]>A[k]+A[k-1]的j,把合并后的值A[k]+A[k-1]插入A[j]的后面,反复进行直到序列为1个数字。
  栗子:
  186 64 35 32 103  (35<103)
  186 67 64 103  (64<103) 
  186 131 103   (A[-1]和A[n]等于正无穷大)
  234 186
  420
  ans=420+234+131+67=852
  O(N^2) 可以勉强过了这道题
 
po4:
   在po3的基础上splay维护此序列。
  O(NlogN)

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define yyj(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout);
#define llg long long
#define maxn 40010
llg i,j,k,x,n,m,a[maxn],ans;
using namespace std;
llg get()
{
llg i=; char c=getchar();
while(c>''||c<'')c=getchar();
while(c>=''&&c<='')i=i*+c-'',c=getchar();
return i;
} int main()
{
yyj("a");
cin>>n;
for (i=;i<=n;i++) a[i]=get();
a[]=a[n+]=0x7fffffff;
for (m=;m<n;m++)
{
a[n-m+]=0x7fffffff;
for (k=;k<=n-m+;k++) if (a[k-]<=a[k+]) break;
x=a[k-]+a[k]; ans+=x;
for (i=k-;i<=n-m;i++) a[i]=a[i+];
for (j=k-;j>=;j--) if (a[j]>x) break;
for (i=n-m;i>j+;i--) a[i]=a[i-];
a[j+]=x;
}
cout<<ans;
return ;
}

你以为这可以A?这只是一发常数写大了超时的

                                           当你把常数写小

1548112 xrdog 3229 正确 1484 kb 60 ms C++/Edit 1080 B 2016-07-14 20:13:13

BZOJ 3229: [Sdoi2008]石子合并的更多相关文章

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

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

  2. [SDOI2008]石子合并 题解

    题面 GarsiaWachs算法专门解决石子合并问题: 设一个序列是A[0..n-1],每次寻找最小的一个满足A[k-1]<=A[k+1]的k,那么我们就把A[k]与A[k-1]合并,并向前寻找 ...

  3. 洛谷 P5569 [SDOI2008]石子合并 GarsiaWachs算法

    石子合并终极通用版 #include<bits/stdc++.h> using namespace std ; ]; int n,t,ans; void combine(int k) { ...

  4. BZOJ-3229 石子合并 GarsiaWachs算法

    经典DP?稳T 3229: [Sdoi2008]石子合并 Time Limit: 3 Sec Memory Limit: 128 MB Submit: 426 Solved: 202 [Submit] ...

  5. BZOJ 3227: [Sdoi2008]红黑树(tree)

    BZOJ 3227: [Sdoi2008]红黑树(tree) 标签(空格分隔): OI-BZOJ OI-其它 Time Limit: 10 Sec Memory Limit: 128 MB Descr ...

  6. RQNOJ 490 环形石子合并

    题目链接:https://www.rqnoj.cn/problem/490 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一 ...

  7. codevs1048 石子合并

    题目链接:http://codevs.cn/problem/1048/ 题目描述 Description 有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代 ...

  8. 石子合并[DP-N3]

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

  9. 51Nod 1021 石子合并 Label:Water DP

    N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价.   例如: 1 2 3 4,有 ...

随机推荐

  1. Window7 驱动编程环境配置

    1.  安装VS2010,WDK7.60(GRMWDK_EN_7600_1) 2.  新建VC 控制台项目(选择为空项目) 3.  新建项目配置“driver” ,点击下拉按钮-点击(配置管理器) 输 ...

  2. ExtJS4笔记 Data

    The data package is what loads and saves all of the data in your application and consists of 41 clas ...

  3. A quick renice command rescheduled the upgrade to a lower priority and I was back to surfing in no time.

    https://www.nixtutor.com/linux/changing-priority-on-linux-processes/ Changing Priority on Linux Proc ...

  4. Nosql学习笔记

    1.利用Query查询,Query操作只搜索主键属性值,并支持对键属性值使用部分比较运算符,以优化搜索过程. * 查询结果始终按范围键排序.如果范围键的数据类型是数字,则会按数字顺序返回结果:否则,会 ...

  5. SQL Server代理警报

    使用SQL Server代理警报的前提条件1.创建操作员,接收消息的用户2.创建警报,满足某种条件触发警报,并作出响应(执行作业或/和通知操作员)3.配置数据库邮件,用于发送消息通知4.SQL Ser ...

  6. Java基础之在窗口中绘图——移动曲线的控制点(CurveApplet 3 moving the control points)

    Applet程序. import javax.swing.*; import java.awt.*; import java.awt.geom.*; import javax.swing.event. ...

  7. Struts(七):action配置文件之通配符映射

    通配符映射:一个Web应用可能有成百上千个action声明,可以使用struts提供的通配符映射机制把多个彼此相似的映射关系简化为一个映射关系. 通配符映射规则: 若找到多个匹配,没有通配符的那个将胜 ...

  8. Dijkstar算法的数学原理

    Dijkstar算法是荷兰数学家迪克斯屈拉(or迪杰斯特拉?)在1959年发现的一个算法.是现有的几个求带权图中两个顶点之间最短通路的算法之一.算是一个相当经典的算法了. 迪克斯屈拉算法应用于无向连通 ...

  9. Centos 安装 Java

    建立文件夹 进入/usr/文件夹下,建立一个文件,我这里是java文件夹,将jdk-8u45-linux-x64.tar.gz复制到/usr/java文件夹下 解压文件 解压指令为:tar -zxvf ...

  10. css字体样式(Font Style),属性

    css字体样式(Font Style),属性   css字体样式(Font Style)是网页中不可或缺的样式属性之一,有了字体样式,我们的网页才能变得更加美观,因此字体样式属性也就成为了每一位设计者 ...