2934. 插头DP
给你一个 的棋盘,有的格子是障碍,问共有多少条回路满足经过每个非障碍格子恰好一次。
如图,, 是障碍,共有 条满足要求的回路。
输入格式
第一行包含两个整数 。
接下来 行,每行包含一个长度为 的字符串,字符串中只包含 *
和 .
,其中 *
表示障碍格子,.
表示非障碍格子。
输出格式
输出一个整数,表示满足条件的回路数量。
数据范围
输入样例:
输出样例:
解题思路
插头dp
插头dp 主要用来解决一些网格图上的哈密顿回路方案的相关问题
本题即 插头dp 模板题,即给出一个网格图,并且要求一些格子不能经过,求哈密顿回路的方案数
做法通常是一格一格做,由于是哈密顿回路,即每个格子会有两条出边(即插头),处理当前格子的时候之前,记录上一行边界出边的状态,通常记录这些的状态有两种方法:
- 最小表示法:由于上面每一个出边,一定会对应另外一条出边,对于每一对匹配边,用同一个数字表示,不同对匹配边之间用不同的数字表示,最后所有的这样的数字连起来的最小表示法即为该边界的状态
- 括号表示法(效率一般更高,因为可以转化为进制之间的运算):从左往右,如果没有当前边界没有出边则用 表示,否则如果该匹配边在左边用 表示,在右边用 表示,最后会形成 这样的数字,但是这样的数字得用四进制表示,原因在于四进制好进行位运算
状态表示: 表示处理到 这个格子时边界状态为 时得方案数
状态计算:
插头dp 的状态转移一般比较复杂,需要分好多情况讨论(这里采用括号表示法):
处理到 这个格子的时候,其左边界插头的状态为 ,上边界插头的状态为 ()
- 如果 是障碍物,则要求 上不能出现插头才是合法状态,即 ,此时状态不变
- 如果 ,即左边界和上边界都没有插头,因为哈密顿回路要求每一个非障碍物的格子都要有两个插头,且这两个插头是连通的,即一定有一个出去然后另外一个回来,更新状态,由定义:
- ,此时 这个插头有两种选择:向下、向右。向右时当前格子的右边界状态即为 ,下边界状态为 ;向下时下边界状态为 ,右边界状态为
- ,同样地,此时 这个插头有两种选择:向下、向右。向右时当前格子的有边界状态为 ,下边界状态为 ;向下时下边界状态为 ,右边界状态为
- ,此时两个插头连通,当前格子的右、下边界状态都为 ,且右边对应的状态需要修改,即此时两个状态 都有一个匹配插头,且都在右边,状态都为 ,由于这两个插头已经连通,所以右边之前未匹配的插头开始匹配,即将右边两个匹配的插头的第一个插头状态修改为
- ,同理,此时两个插头连通,当前格子的右、下边界状态都为 ,且左边对应的状态需要修改,即此时两个状态 都有一个匹配插头,且都在左边,状态都为 ,由于这两个插头已经连通,所以左边之前未匹配的插头开始匹配,即将右边两个匹配的插头的第二个插头状态修改为
- ,此时两个插头连通,当前格子的右、下边界状态都为 ,由于此时两个插头连通,但是对应的匹配的插头正好左边的匹配插头状态为 ,右边的匹配插头状态为 ,所以这时这样的状态不用修改
- ,此时两个插头连通,但是对于当前 来说,其对应的匹配插头在右边,对于 来说,其对应的匹配插头在左边,这样两条路径要么相交,要么重合,由于两条路径相交的话就不再是一条哈密顿回路,所以只能重合,而重合说明当前遍历的格子一定得是最后一个合法的格子
设有效状态数量为 ,则:
- 时间复杂度:
代码
__EOF__

本文作者:acwing_zyy
本文链接:https://www.cnblogs.com/zyyun/p/16978234.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/zyyun/p/16978234.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战