P2595 [ZJOI2009] 多米诺骨牌
轮廓线 DP + 外部容斥。似乎是 CDQ 论文题。
有一个
的矩形表格,其中有一些位置有障碍。现在要在这个表格内放一些 或者 的多米诺骨牌,使得任何两个多米诺骨牌没有重叠部分,任何一个骨牌不能放到障碍上。并且满足任何相邻两行之间都有至少一个骨牌横跨,任何相邻两列之间也都至少有一个骨牌横跨。求有多少种不同的放置方法,注意并不需要放满所有没有障碍的格子。 。
-
轮廓线思维是经典的优化状压 DP 方法。相比于一次确定一行时不仅要枚举上行状态还要枚举当前行状态,轮廓线方法依次确定一行的每个位置
,并且状压下上一行的 和这一行的 (轮廓线)作为状态。把一次转移一层改为一次转移一步,做到 转移。 -
考虑一类问题的限制需要记录的状态过多,导致难于 DP。例如此题,障碍限制容易处理,但 DP 中处理行和列的限制要求存下之前所有行和列。所以考虑 外部容斥,就是 DP 中去掉部分限制得到结果,在外面枚举满足哪些限制,利用之前结果容斥计算。
-
在此题中,可以发现假设枚举了某
行和某 列不能跨过,整个图被分为至多 个矩阵内部分别填写,不能跨越矩阵边界。相当于只需要求 表示每个子矩阵内部不考虑行列限制填写的方案数,用它乘法原理计算。需要枚举 (因为要状压行)后再跑 DP 求出。 -
但是最后的容斥需要
复杂度爆炸。考虑 外部容斥 中,我们只需要 去掉部分限制,例如此题 DP 中不能处理的仅是跨越列的限制,跨越行的限制可以利用状压处理。于是考虑改内层为 带容斥系数 DP(为了计算容斥系数,可以加一维状态 )。外部只需要枚举哪些列满足限制即可。 -
也可以考虑不修改内层 DP,而是在中间再套一个 DP。也就是在 枚举了行的限制的前提下 DP 计算列的贡献和,相当于在
上做序列分段 DP(带容斥系数)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话