插头dp

插头dp 俗称轮廓线dp,

各种网格覆盖问题,范围允许状压解决,常用于计算方案数与联通块权值

插头是tm啥?格子与格子之间的状态

网上图很多,不挂了

说一说对各种状态的理解

已知b1,b2

当前有障碍的话,显然不能走

只讨论没有障碍,能走的情况

  • b1=0,b2=0

增加两个插头,要回路,因此要一个右插头一个下插头

  • b1=0,b2=1

考虑向右拐,和向下直走

  • b1=1,b2=0

考虑向下拐,和向右直走

  • b1=1,b2=1

在右边找个匹配的右插头,然后把原来的两个1都干掉,在现在找到的位置把2干掉,把1重新弄上去

  • b1=2,b2=2

在左边找个…

  • b1=2,b2=1

考虑连上,该干啥干啥

  • b1=1,b2=2

如果不是终点不要记录答案

各种含义
dp[][x] = y, 第x次所表示的价值为y
vis[][x] = y, 第x次所表示的状态为y
cnt[x] = y, cntx这一维度表示的状态数目
hash[x] = y, x这个**位置**在HASH里对应的第y次(在当前状态下)