首先这题的$n^3$的DP是比较好想的

$f[i][j]$表示用前$i$包干草 且最顶层为第$j+1$包到第$i$包 所能达到的最大高度

然而数据范围还是太大了 因此我们需要去想一想有没有什么单调性

----------------------------------------------------------------------------------------------------

从其他人的题解中 可以看到一个结论 我们尽量使底层最短 便可逐渐达到最优解

然后再结合递推的思想去做 我们就会使在底层最短的基础上使第二层最短 以此类推……

然而根据这个结论 我还是没有什么明确的实现思路 不过忽然想到了这样一组数据

3

2 1 4

我们会发现 仅用前两包 可以达到2的高度 然而加上第3包后 反而只能达到1的高度了

可是如果倒着推的话 情况就大不一样了 因为多的部分直接堆在底层就好了

所以倒着推所得到的答案是单调的

这样的话 我们又可以用 $f[i]$记录以$i$到$n$包做草堆 底层的最小长度 $g[i]$记录此时能达到的最大高度

这样就优化到$n^2$了

----------------------------------------------------------------------------------------------------

接下来 我们再观察一下递推式

$f[i]=min(sum[j-1]-sum[i-1])$,$(j>i,f[j]<=sum[j-1]-sum[i-1])$

显然$f[i]$从较小的j转移过来结果会更优(如果符合转移条件的话)  $(*)$

而对于转移条件 $f[j]<=sum[j-1]-sum[i-1]$ 我们把式子移项得到 $sum[i-1]<=sum[j-1]-f[j]$

这样的话 对于决策j 显然$sum[j-1]-f[j]$越大 可以作为决策的情况就越多 而根据$(*)$ 我们知道j越小越好

因此如果存在决策$k>j$ 满足 $sum[k-i]-f[k]>=sum[j-1]-f[j]$ 那么决策k便一定不能用上

于是这个问题就转变为了用单调队列来维护单调性DP的经典模型了

----------------------------------------------------------------------------------------------------

具体实现可参考代码(然而如果把上面的内容认真读了还不会自己实现的话……)

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define rep(i,n) for(int i=1;i<=n;++i)
#define imax(x,y) (x>y?x:y)
#define imin(x,y) (x<y?x:y)
using namespace std;
const int N=;
int sum[N],f[N],g[N],q[N];
int n;
int main()
{
scanf("%d",&n);
rep(i,n)
{
scanf("%d",&sum[i]);
sum[i]+=sum[i-];
}
int ifront=,itail=;
q[]=n+;
for(int i=n;i;--i)
{
while(ifront<itail&&sum[q[ifront+]-]-sum[i-]>=f[q[ifront+]])
++ifront;
f[i]=sum[q[ifront]-]-sum[i-];
g[i]=g[q[ifront]]+;
while(ifront<=itail&&sum[q[itail]-]-f[q[itail]]<=sum[i-]-f[i])--itail;
q[++itail]=i;
}
printf("%d",g[]);
return ;
}

bzoj 1233: [Usaco2009Open]干草堆tower 【想法题】的更多相关文章

  1. bzoj 1233: [Usaco2009Open]干草堆tower

    1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...

  2. ●BZOJ 1233 [Usaco2009Open] 干草堆 tower

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=1233 留坑.以后再来看看. (绝望,无奈,丧心...) (这个题的证明真的很诡异啊,看得我稀 ...

  3. bzoj 1233: [Usaco2009Open]干草堆tower【dp+单调栈】

    参考:https://www.cnblogs.com/N-C-Derek/archive/2012/07/11/usaco_09_open_tower.html 虽然长得很像斜率优化,但是应该不算-- ...

  4. 1233: [Usaco2009Open]干草堆tower

    传送门 感觉正着做不太好搞,考虑倒过来搞 容易想到贪心,每一层都贪心地选最小的宽度,然后发现 $WA$ 了... 因为一开始多选一点有时可以让下一层宽度更小 然后有一个神奇的结论,最高的方案一定有一种 ...

  5. 【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)

    1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...

  6. bzoj1233[Usaco2009Open]干草堆tower 单调队列优化dp

    1233: [Usaco2009Open]干草堆tower Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 983  Solved: 464[Submi ...

  7. bzoj1233 [Usaco2009Open]干草堆tower 【单调队列dp】

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1233 单调队列优化的第一题,搞了好久啊,跟一开始入手斜率优化时感觉差不多... 这一题想通了 ...

  8. bzoj1233: [Usaco2009Open]干草堆tower

    Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的干草(1<=N<=100000)(从1到N编号) ...

  9. 【BZOJ 1233】 干草堆

    [题目链接] 点击打开链接 [算法] 这题有一个性质 : 位于顶层的干草堆可以满足宽度最小且高度最高 根据这个性质,用单调队列优化DP,即可 [代码] #include<bits/stdc++. ...

随机推荐

  1. 机器学习实战笔记-11-Apriori与FP-Growth算法

    Apriori算法 优点:易编码实现:缺点:大数据集上较慢:适用于:数值型或标称型数据. 关联分析:寻找频繁项集(经常出现在一起的物品的集合)或关联规则(两种物品之间的关联关系). 概念:支持度:数据 ...

  2. JNDI配置笔记

    先在tomcat Context.xml配置文件中配置 <Resource name="jdbc/elifecrm" type="javax.sql.DataSou ...

  3. ELK日志分析系统之elasticsearch7.x最新版安装与配置

    1.Elasticsearch 1.1.elasticsearch的简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful ...

  4. [Python3 练习] 010 找出藏在字符串中的“密码”

    题目:找出藏在字符串中的"密码" (1) 描述 1) 题源 1 Python Challenge, level 3 2) 题源 2 小甲鱼老师的 Python 课程,第 20 讲课 ...

  5. zabbix 微信告警配置

    作者信息 邮箱:sijiayong000@163.com Q Q:601566386 Zabbix 微信告警 摘要:Zabbix可以通过多种方式把告警信息发送到指定人,常用的有邮件,短信报警方式,但是 ...

  6. java虚拟机笔记-1

    java虚拟机学习笔记 Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行.Java程序的运行需要Java虚拟机.Java API和Java Class文件的配合.Java虚 ...

  7. UML 类图关系(继承,实现,依赖,关联,聚合,组合)

    1.继承(is-a)      指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能.并能够添加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系:在Java中此类 ...

  8. 【学习总结】Python-3-字符串运算符与字符串格式化

    参考: 本教程的评论区:菜鸟教程-Python3-Python数字 字符串运算符: 实例变量a值为字符串 "Hello",b变量值为 "Python": 字符串 ...

  9. 下载了包在node_modules中,但没有在package.json中保存该包信息。

    发现安装了包,但没有在package.json中保存该包信息,而且没有创建package-lock.json. 经过测试,发现是使用cnpm的原因,使用npm安装不会出现这样的问题,(与cnpm版本无 ...

  10. Oracle数据库同义词

    一.定义 同义词顾名思义,是数据库方案对象的一个别名.这里的数据库方案对象指表.视图.序列.存储过程.包等. 二.同义词的好处 1.不占内存空间,节省大量的数据库空间 2.简化了数据库对象的访问 3. ...