题号 NC24881
名称 Tower of Hay
来源 USACO
每日一题三期汇总贴~
如果你在题库做题时遇到了喜欢的题目,欢迎推荐给邓老师~ 点击查看详情
欢迎给每日一题投稿,投稿需要提供牛客题库里的题目+题解 投稿有牛币奖励,可发站内信给王清楚或联系QQ 234186389
每日一题QQ群:659028468
题解
最开始大家可能会觉得,前i个草垛能组成的最大高度和最上层的最大宽度的有关系的,如果要dp,最大高度和最上层宽度至少要有一个出现在状态里,比如用表示前个草垛堆成一堆最高的一层宽度为时的最大高度——复杂度不允许。
我们再仔细分析这个问题,刚刚的状态为什么离不开?
如果我们不知道最高层的宽度,上面再叠的时候就不一定能叠上去了无法转移,如果我分开用两个数组表示前个草垛能堆出的最大高度和最大高度下的宽度则错得更离谱——不一定前个堆得越高就越高,这样很有可能后面就宽度不够堆不上了。
但是,如果我们从后往前堆(即从最高层开始堆),问题会发生一些变化——后个如果堆了层,那么我们一定希望最下方那一层越小越好,而且,只要前个的宽度能比第层大,后个堆的层就一定能放上去,不会存在走入无解的死胡同这种情况。
所以我们倒着dp,表示后个草垛,其中第i个草垛是最后一层的最后一个时能达到的最大高度,存对应的最小宽度,考虑上一层的最后一个草垛是哪个
其中从到枚举,且满足第到第个草垛宽度加起来大于,即
第到第个草垛宽度用后缀和维护求解(其实用前缀和也可以,搞清楚加一减一的关系就好)。
因为j要满足,其实是在一个区间里面去找最小的j(j离i越近g越小),这个区间的右界随着i的左移,是不往右移动的,所以用单调队列维护即可。
欢迎各位大佬来做题写题解,也欢迎大家踊跃在当日讨论贴中提问!
活动奖励:
在牛客博客中写出题解,并回复地址
审核通过可获得(依据题目难度和题解的内容而定)
本道题目3月24日中午12:00之前写的题解有获得牛币资格~
牛客博客开通方式
- 如何开通牛客博客:https://www.nowcoder.com/discuss/202952
- 如何使用博客搬家功能:进入博客--->设置--->底部博客搬家
- 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴
全部评论
(6) 回帖