P2595 [ZJOI2009] 多米诺骨牌

轮廓线 DP + 外部容斥。似乎是 CDQ 论文题。

有一个 n×m 的矩形表格,其中有一些位置有障碍。现在要在这个表格内放一些 1×2 或者 2×1 的多米诺骨牌,使得任何两个多米诺骨牌没有重叠部分,任何一个骨牌不能放到障碍上。并且满足任何相邻两行之间都有至少一个骨牌横跨,任何相邻两列之间也都至少有一个骨牌横跨。求有多少种不同的放置方法,注意并不需要放满所有没有障碍的格子。n,m15

  1. 轮廓线思维是经典的优化状压 DP 方法。相比于一次确定一行时不仅要枚举上行状态还要枚举当前行状态,轮廓线方法依次确定一行的每个位置 i,并且状压下上一行的 (i,m] 和这一行的 [1,i](轮廓线)作为状态。把一次转移一层改为一次转移一步,做到 O(2mm) 转移。

  2. 考虑一类问题的限制需要记录的状态过多,导致难于 DP。例如此题,障碍限制容易处理,但 DP 中处理行和列的限制要求存下之前所有行和列。所以考虑 外部容斥,就是 DP 中去掉部分限制得到结果,在外面枚举满足哪些限制,利用之前结果容斥计算。

  3. 在此题中,可以发现假设枚举了某 r 行和某 c 列不能跨过,整个图被分为至多 (r+1)(c+1) 个矩阵内部分别填写,不能跨越矩阵边界。相当于只需要求 gi,j,l,r 表示每个子矩阵内部不考虑行列限制填写的方案数,用它乘法原理计算。需要枚举 i,l,r(因为要状压行)后再跑 DP 求出。

  4. 但是最后的容斥需要 O(2n+mnm) 复杂度爆炸。考虑 外部容斥 中,我们只需要 去掉部分限制,例如此题 DP 中不能处理的仅是跨越列的限制,跨越行的限制可以利用状压处理。于是考虑改内层为 带容斥系数 DP(为了计算容斥系数,可以加一维状态 0/1)。外部只需要枚举哪些列满足限制即可。

  5. 也可以考虑不修改内层 DP,而是在中间再套一个 DP。也就是在 枚举了行的限制的前提下 DP 计算列的贡献和,相当于在 g 上做序列分段 DP(带容斥系数)。

posted @   音街ウナ  阅读(52)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示