[BZOJ1233] [Usaco2009Open]干草堆tower
2016-03-17 19:00
162 查看
传送门
http://www.lydsy.com/JudgeOnline/problem.php?id=1233题目大意
有n个干草堆排成一行,每堆有个宽度ai,现在要且分成若干段,把每一段的干草拼起来,然后逐段堆砌,越左的段放在下面,且宽度要逐层非严格递减。求层数最多是多少层有 n 个干草堆排成一行,每堆有个宽度 ai,现在要且分成若干段,把每一段的干草拼起来,然后逐段堆砌,越左的段放在下面,且宽度要逐层非严格递减。求层数最多是多少层题解
O(N3)的DPO(N^3)的DPdp[i,j]=max{dp[j−1,k]}+1 (sum[i]−sum[j−1]≤sum[j−1]−sum[k−1])dp[i,j]=max\{dp[j-1,k]\}+1~~~~~~(sum[i]-sum[j-1]\le sum[j-1]-sum[k-1])
但是这个时间空间都爆炸了,我们考虑从单调性入手但是这个时间空间都爆炸了,我们考虑从单调性入手
有一个结论,最优解的最下面一层一定最小(这个感受一下就好了.....越窄层数才越高...)有一个结论,最优解的最下面一层一定最小(这个感受一下就好了.....越窄层数才越高...)
任意取出一个能使层数最高的方案,设有CA层,把其中从下往上每一层最大的块编号记为Ai;任取一个能使底边最短的方案,设有CB层,把其中从下往上每一层最大的块编号记为Bi。显然A1>=B1,ACB<=BCB,这说明至少存在一个k属于(1,CB),满足Ak-1>=Bk-1且Ak<=Bk。也就是说,方案 A 第K 层完全被方案 B 第K 层包含。构造一个新方案,第K 层往上按方案 A,往下按方案 B,两边都不要的块放中间当第K 层。新方案的层数与 A 相同,而底边长度与 B 相同。证毕。
证明by zkw
但是正着推我们发现并不单调,打表发现倒着会单调,所以我们倒着推一推但是正着推我们发现并不单调,打表发现倒着会单调,所以我们倒着推一推
f[i]:用if[i]:用i~n来构成的堆,最靠下的一层最短是多少n来构成的堆,最靠下的一层最短是多少
g[i]:状态f[i]的最大高度g[i]:状态f[i]的最大高度
f[i]=min{sum[j−1]−sum[i−1]} (i<j≤n,f[j]≤sum[j−1]−sum[i−1])f[i]=min\{sum[j-1]-sum[i-1]\}~~~~~~(i
g[i]=g[j]+1g[i]=g[j]+1
这样就优化到O(N2)了这样就优化到O(N^2)了
显然j越小越好,也就是说当第一个j满足你就可以跳出了~
好吧我们还是说些正经点的东西….
转移条件我们移下项sum[i−1]≤sum[j−1]−f[j]转移条件我们移下项sum[i-1]\le sum[j-1]-f[j]
当有两个决策点j<k且sum[k−1]−f[k]≤sum[j−1]−f[j]时,k可以被剔除当有两个决策点j
单调队列~~
CODE
相关文章推荐
- Linux学习笔记--find命令(文件搜索命令)
- Apache优化:修改最大并发连接数
- Apache优化:修改最大并发连接数
- 《Linux操作系统分析》之使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- 初识apache commons-pool 2.x
- 关于AVPlayer pop时崩溃的问题
- CentOS下的Mysql自动备份
- android selinux权限, Permission denied, 访问限制
- Linux 基础命令3
- Linux 基础命令2
- Linux Shell脚本编程--curl命令详解
- android自学问题一:dos命令行输入adb shell命令报错
- adb shell命令详解
- Linux Mint 与 Windows7 双系统更改启动顺序
- linux下U盘挂载
- HADOOP 集群配置遇到的问题
- 鸟哥LInux学习拾遗(1)
- Linux文件查找工具之find “大宝剑”--转载
- 【Data Algorithms_Recipes for Scaling up with Hadoop and Spark】Chapter 7 Market Basket Analysis
- linux如何关闭防火墙