[省选前题目整理][POJ 3133]Manhattan Wiring(插头DP)

59 篇文章 0 订阅
19 篇文章 0 订阅

题目链接

http://poj.org/problem?id=3133

题目大意

给定一个n*m的棋盘,每个格子要么是空格,要么是障碍物,要么是格子1,要么是格子2,整个棋盘有且仅有2个格子1,2个格子2,现在要把两个1用联通块连起来,两个2用联通块连起来,而且两坨联通块之间不能有交集,求两坨联通块大小-2。
整体思路:插头DP、最小表示法。
不妨设整个棋盘数组为map[][],map[i][j]=0表示(i,j)是障碍物,1表示是空格,2表示是格子2,3表示是格子3。而对于长度为m+1的轮廓线状态,轮廓线上每一位我们用一个四进制数表示,0表示无插头,2表示为连接两个2的路径的插头,3表示为连接两个3的路径的插头,其实用个3进制就能解决了,但是最终还是要用22=4进制来表示,就干脆用4进制方便下算了。
但是此题分类讨论的细节太多太繁杂,代码长,难写也很容易错,下面是喜闻乐见的讨论时间:
1、(i,j)是个障碍物,显然路径不能过(i,j),而且之前的右插头和下插头都会清掉。

2、(i,j)是空格,之前的右插头和下插头编号不同,之前的右插头变成下插头、之前的下插头变成右插头后它们的编号保持不变。

3、(i,j)是空格,之前的右插头和下插头编号相同,那么加入(i,j)后会产生一个新的联通块,两个插头都清掉,但是f值仍然要加1,因为这一坨联通块可以属于路径上的一部分。

4、(i,j)是空格,右插头或下插头中有一个是空插头,且(i,j)的右边的格子编号与不是空的那个插头相同或者是空格(都是1或2或都是3),那么原来的右插头变成下插头后清零,下插头变成右插头后变成这个右边的格子编号,走到右边的格子后表明找到了一条可行路径。

5、(i,j)是空格,右插头或下插头中有一个是空插头,且(i,j)的下面的格子编号与不是空的那个插头相同或者是空格(都是1或2或都是3),那么原来的右插头变成下插头后变成下面的格子的编号,下插头变成右插头后清零,走到下面的格子后表明找到了一条可行路径。

6、(i,j)是空格,右插头和下插头均为空插头,且(i,j)下面是空格,右边是空格。右插头和下插头变换后要么同时变成2,要么同时变成3。表明过两个2或两个3的路径可以过这个空格。但是不能一个插头变成2,一个变成3,这样就会出现2的路径和3的路径交叉的不合法情况。

7、(i,j)是空格,右插头和下插头均为空插头,且(i,j)下面和右边的两个空格中有一个是2或3。右插头和下插头变换后都变成这个相邻格子的编号。表明这个相邻格子可以走过(i,j)往另一个有插头的方向走。

8、(i,j)是2或3,右插头和下插头都为空插头,且(i,j)的右边的格子编号与不是空的那个插头相同或者是空格(都是1或2或都是3)。类4。
9、(i,j)是2或3,右插头和下插头都为空插头,且(i,j)的下面的格子编号与不是空的那个插头相同或者是空格(都是1或2或都是3)。类5。
10、(i,j)是2或3,右插头和下插头中一个是2或3,另一个是空插头,那么加入(i,j),右插头和下插头变换后,把它们都清掉,表明一条2或3的路线走完了(如果(i,j)是一条路径的起点的话,那么它不应该有不为空的插头)。

讨论完了,另外我们要注意,此题并不是一个求棋盘上的回路的问题,而是求路径,这是比较特殊的单插头DP问题,也就是说在一条轮廓线上,插头和插头之间不存在配对的问题。但是如果我们加入某个点后,产生了一个回路(如情况3),那么会产生一坨联通块,这坨联通块仍然属于整条路径。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值