插头 DP。其核心思想是,利用状压维护轮廓线的状态进行 Dp 转移。
本文十分详细,富含丰富的图文解释,如果还是看不懂那么没救了。
定义
这是一个8×58 \times 58×5的网格,其中蓝线代表其中一条回路。我们暂且不考虑其障碍。
记当前从左到右,从上往下枚举,枚举到的为图中绿色格子(4,4)(4,4)(4,4),则有:
轮廓线:为红色的一条线,其作用是区分已枚举与未枚举部分的分割线。
插头:为了满足回路性质,一个格子有两个插头,对应的是四个方向其中的两个在回路图上的出度和入度。具体地,如格子(2,2)(2,2)(2,2)就有两个插头,分别为右插头和下插头。
状态设计
考虑对回路赋予方向。其中橙色的箭头代表着回路走到方向。
考虑用状态去记录轮廓线与回路相交的关系。
容易发现:
箭头向下:代表着已枚举的部分穿过轮廓线向未枚举的部分走。记为111。
箭头向上:代表着未枚举的部分穿过轮廓线向已枚举的部分走。记为222。
没有箭头:代表着轮廓线没有与回路有交点,即为000。
那么我们就可以赋予上图中轮廓线的状态:(121002)3(121002)_3(121002)3。可以用三进制表示。
重点:状态记录的方式实际上是括号序列。
即,状态中的111和222是满足括号匹配的。
若一个轮廓线上从左到右a,b,c,da,b,c,da,b,c,d四个点,若(a,c)(a,c)(a,c)是联通的,即从aaa往下走,然后从ccc又往上走回去。那么(b,d)(b,d)(b,d)肯定不能联通。可以理解为被(a,c)(a,c)(a,c)挡住,感性证明一下。
当然这个所谓的方向(即111和222)实际上是相对的,而并非绝对的。他是在维护的过程中改变的,只要满足括号匹配原则即可。
状态转移
dpi,j,sdp_{i,j,s}dpi,j,s代表枚举到点(i,j)(i,j)(i,j),其轮廓线状态(一个三进制数)sss的方案数。
发现每一次转移只与上一次的轮廓线状态有关系。所以前两维可以优化掉。所以可以设计新状态dpnow,s,now∈{ 0,1}dp_{now,s} ,now \in \{0,1\}dpnow,s,now∈{0,1}。
记当前枚