本文主要是介绍[BZOJ4664]Count/[JOI Open 2016]摩天大楼,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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
这篇关于[BZOJ4664]Count/[JOI Open 2016]摩天大楼的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!