P5215 [SHOI2014] 神秘金字塔

· · 题解

不算难的一道状态压缩 dp 题。

首先这个题面就很抽象,非要说得那么复杂。

手玩一下样例可以发现,这个金字塔可以分成完全相同的 4 部分,只需要考虑其中一部分就可以了。

将其形式化一下就是有一个二维数组 a,满足

对所有可能的 a 计数,其中 l_1,h\le 10n\le 250l_1\ge l_2\ge ... \ge l_h

直接做确实不太行,突破点在于 l_1 很小,发现所有可能的 a 的第一行状态全部搜出来,只有 48620 种。

于是考虑状压 dp,设 f_{i,S,j} 表示到了第 i 行,当前状态为 S,当前 a 的总和为 j 的方案数。

转移的话非常简单,枚举当前行的状态 S,上一行的状态 T,看能不能转移。可惜直接来的话最坏枚举次数达到了 48620^2

注意到能转移的条件本质上是一个高维的包含关系,使用高维后缀和优化即可。

有一些细节需要注意:由于一个合法的状态满足数单调不增,按照正常的高维后缀和写法可能会出现一些问题,例如二维情况下 (0,0)(1,1),按理来说是 (1,1) 先转移到 (0,1) 最后转移到 (0,0)。但是 (0,1) 这个状态是不合法的,可能不存在导致贡献统计错误,于是需要进行修正。当高维前缀和进行到第 i 维时,如果是从不合法的状态转移而来,需要将该状态进行修正,即如果前面存在比第 i 个数小的数,滚一遍后缀 max 即可。例如 (0,1) 就直接修正成 (1,1)