[BZOJ4664]Count/[JOI Open 2016]摩天大楼

博客解析了一道动态规划题目——摩天大楼,通过分析如何处理绝对值贡献和状态转移,提出了一种O(n²L)时间复杂度的解决方案,并提供了源码实现。
摘要由CSDN通过智能技术生成

Count / 摩天大楼

题解

简单dp。

然而再想一遍又忘记怎么dp了,这种连续段dp确实很难想

首先发现这道题的贡献是绝对值,有点烦,考虑如何去掉绝对值。
我们可以对 h h h从大到小排序,这样加入 h i h_{i} hi时,已经加入的点会对其产生贡献的一定都比它大,所以我们可以直接加。
考虑每个点加入时会产生怎样的贡献:

  • 如果加入的点单独成段且不靠墙,会令贡献加上 2 h i 2h_{i} 2hi
  • 如果加入的点在某一段的两侧或靠一堵墙将不产生贡献。
  • 如果加入的点两侧全是墙与段,它将起连接两段的作用,会令贡献减去 ( 2 / 1 ) h i (2/1)h_{i} (2/1)hi

于是我们很快就想到了一个dp方法,令 d p i , j , t , k dp_{i,j,t,k} dpi,j,t,k表示到第 i i i大的书,已经成了 j j j段,总贡献为 t t t,靠 k k k堵墙的方案数。
状态转移方程式也很好想。
但这样有个问题,因为贡献这一维带减法,所以它有可能有部分大于 L L L很多,这样空间复杂度就超了。
考虑对贡献的求法进行一下转化。

我们发现加入一个点时会对贡献产生怎样的影响。
假设有 j j j段, k k k堵墙,贡献会受到怎样的影响。由于当前加入的点是一定小于前面点的,所以对于一个段的边缘,直到合并位置,高度都在递减。
而当前插入位置递减的高度与前一本书有关,如果我们以第 i

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值