您的位置:首页 > 运维架构

[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)的DP

dp[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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: