bzoj1233 [Usaco2009Open]干草堆tower 【单调队列dp】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1233
单调队列优化的第一题,搞了好久啊,跟一开始入手斜率优化时感觉差不多。。。
这一题想通了之后其实不是很难,主要是需要拐弯的地方有点点多,直接写正解叭~
首先,这一题要求的是最大叠多少层。可以这样想:最底层的长度越小,层数越高。尽管这不是很严格,不过还算是比较显然(但是根本就没往这上面想啊!),因为越窄,就会越高嘛。换句话说“最大能叠多少层”等价于“最底层长度最小为多少”!只要这个想通了,基本就差不多了。
倒着dp,f[i]为从第i到第n的干草堆都使用了,最底层的长度的最小值。s[i]是前缀和。那么dp方程是:
f[i] = min(s[j - 1] - s[i - 1]) (f[j] <= s[j - 1] - s[i - 1])
附加条件移项得,s[i - 1] <= s[j - 1] - f[j],也就是说,s[j - 1] - f[j]越大,就越有可能作为决策。
裸的是O(N^2)。发现当j越小,s[j - 1] - s[i - 1]就会越小,所以应该取符合"s[i - 1] <= s[j - 1] - f[j]"这一条件的最小的j,这就用单调队列维护咯。当j < k时,若s[j - 1] - f[j] >= s[k - 1] - f[k],则k一定不能作为决策,因为k比j大,对于“当j越小,s[j - 1] - s[i - 1]就会越小”这个条件已经不利了,它的s[k - 1] - f[k]还要更小,更不利了,果断舍弃。
答案要的是最多叠几层,用个g数组,g[i]表示从第i到第n的干草堆都使用了,最多叠几层。则g[i] = g[j] + 1,j就是对于f[i] = min(s[j - 1] - s[i - 1])的决策的那个j
#include <cstdio>
const int maxn = ;
int n, s[maxn], f[maxn], g[maxn], que[maxn], head, tail;
int main(void) {
scanf("%d", &n);
for (int i = ; i <= n; ++i) {
scanf("%d", s + i);
s[i] += s[i - ];
}
que[tail++] = n + ;
for (int i = n; i; --i) {
while (head < tail - && s[i - ] <= s[que[head + ] - ] - f[que[head + ]]) {
++head;
}
f[i] = s[que[head] - ] - s[i - ];
g[i] = g[que[head]] + ;
while (head < tail && s[i - ] - f[i] >= s[que[tail - ] - ] - f[que[tail - ]]) {
--tail;
}
que[tail++] = i;
}
printf("%d\n", g[]);
return ;
}
bzoj1233 [Usaco2009Open]干草堆tower 【单调队列dp】的更多相关文章
- bzoj1233[Usaco2009Open]干草堆tower 单调队列优化dp
1233: [Usaco2009Open]干草堆tower Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 983 Solved: 464[Submi ...
- BZOJ1233 [Usaco2009Open]干草堆tower 【单调队列优化dp】
题目链接 BZOJ1233 题解 有一个贪心策略:同样的干草集合,底长小的一定不比底长大的矮 设\(f[i]\)表示\(i...N\)形成的干草堆的最小底长,同时用\(g[i]\)记录此时的高度 那么 ...
- BZOJ1233 [Usaco2009Open]干草堆tower[贪心+单调队列优化]
地址 注意思路!多看几遍! 很巧妙的一道题.不再是决策点以dp值中一部分含j项为维护对象,而是通过维护条件来获取决策. 首先有个贪心策略,让底层的宽度尽可能小,才能让高度尽可能高.所以应该倒着dp,表 ...
- bzoj1233: [Usaco2009Open]干草堆tower
Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的干草(1<=N<=100000)(从1到N编号) ...
- BZOJ1233 [Usaco2009Open]干草堆tower 和 BZOJ3549 [ONTAK2010]Tower
题意 Problem 3549. -- [ONTAK2010]Tower 3549: [ONTAK2010]Tower Time Limit: 10 Sec Memory Limit: 64 MBS ...
- 【BZOJ 1233】 [Usaco2009Open]干草堆tower (单调队列优化DP)
1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...
- bzoj 1233: [Usaco2009Open]干草堆tower
1233: [Usaco2009Open]干草堆tower Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的 ...
- bzoj 1233: [Usaco2009Open]干草堆tower 【想法题】
首先这题的$n^3$的DP是比较好想的 $f[i][j]$表示用前$i$包干草 且最顶层为第$j+1$包到第$i$包 所能达到的最大高度 然而数据范围还是太大了 因此我们需要去想一想有没有什么单调性 ...
- 1233: [Usaco2009Open]干草堆tower
传送门 感觉正着做不太好搞,考虑倒过来搞 容易想到贪心,每一层都贪心地选最小的宽度,然后发现 $WA$ 了... 因为一开始多选一点有时可以让下一层宽度更小 然后有一个神奇的结论,最高的方案一定有一种 ...
随机推荐
- 【Todo】STAR面试法
今天在面试培训的时候,接触到了STAR面试法. 觉得挺好的,用来准备非技术面试,还蛮全面的.所以可以多了解一下. 可以参考:http://www.hrloo.com/rz/73652.html
- grails的criteria和hql查询
grails在查询方面也保留了hibernate的hql和criteria查询功能.hql自然不必多说基本不会有什么变化,grails的criteria查询在hibernate上面做了微调使用起来更加 ...
- [Bash] Move and Copy Files and Folders with Bash
In this lesson we’ll learn how to move and rename files (mv) and copy (cp) them. Move index.html to ...
- CSS制作翻牌特效
应一个朋友要求替他把原本静态页面做成翻牌的特效. 主要应用了CSS3的transform,transiton.首先写好标签,一个ul下两个li元素,通过position的absolue设置两个li元素 ...
- Android-shareSDK
1.当数据: 地址:http://sharesdk.mob.com/Download 2.集成数据: DOS命令: java -jar QuickIntegrater.jar (输入自己的项目名 ...
- 卸载ubuntu自带openJDK,更改成自己的JDK版本
你已经成功把jdk1.6.0_03 安装到 /usr/java,并且配置好了系统环境变量 执行 # java -version 时就是 显示jdk1.4.3,是因为你的linux系统有默认的jdk;执 ...
- Django's CSRF mechanism
Forbidden (403) CSRF verification failed. Request aborted. You are seeing this message because this ...
- 契约式设计 契约式编程 Design by contract
Design by contract - Wikipedia https://en.wikipedia.org/wiki/Design_by_contract What is the use of & ...
- 查询局域网内全部电脑IP和mac地址等信息
怎么查询局域网内全部电脑IP和mac地址等信息_百度经验 https://jingyan.baidu.com/article/54b6b9c0348e432d583b47c1.html 枚举ping ...
- 修改系统时间(取得服务器时间,使用SetLocalTime API函数,需要UAC权限)
我的客户遇到系统时间不对,自己又不会改,于是想到利用服务端时间来修改本地的系统时间. 第一步,把下面xml存成uac.xml文件备用. <?xml version="1.0" ...