这谁想得到是 DP 呀……
可以考虑分别算上下矩形然后再合并。
显然,我们要基于上矩形的下边界和下矩形的上边界来计算。
设 fi,l,r 表示当上矩形的下边界为 (i,l)∼(i,r) 时,能得到的最大合法高度。
注意此时并不需要判断下边界上是否有障碍,原因等会再说。
有一个显然的 O(n4) 转移即枚举 i,l,r 和高度,并且用行和列的前缀和来判定。
然鹅这样灰常傻……
为什么我们要留下边界不判呢?就是为了转移时直接沿用 fi−1,l,r 的答案。
于是就可以做到 O(n3) 了。
然后设 gi,l,r 表示下矩形的上边界对应的最大高度,转移类似。
考虑合并。
设 hi,l,r 表示当下矩形的上边界为 (i,l)∼(i,r) 时,上矩形的最大面积。
借助 f,g 有一个更傻的 O(n5) 的转移……
注意到这个转移的过程相当于找 max[l′,r′]⊆[l,r](r′−l′−1)(fi,l′,r′−2)。
那么我们可以考虑合并 hi,l+1,r 和 hi,l,r−1 的值为 hi,l,r,并且加入 fi,l,r 的贡献。
显然对于 [l′,r′]⊂[l,r] 必有 [l′,r′]⊆[l+1,r] 或 [l′,r′]⊆[l,r−1](注意是真子集)。
然后会发现空间炸了。这就是我设 f,g 为高度而非面积的原因:开成 short 即可。
注意 h 转移时和 i 无关,所以可以压掉 i 这一维。
代码:
1 |
|