简单插头DP小结
因为独立插头还有最小表示法没有打过,独立插头没看懂,广义路径连看都没看过,所以这些不再本文的总结范围内。
去年学插头DP的时候还是很惧怕的,也只做了一题,还是按着课件对着标程打的。还好今年终于懂得原理了。其实打多了也变成模板了(当然每题的转移不一样)。
插头DP有下面的分类:
- 按模型:多回路问题、单回路问题、简单路径问题、广义路径问题
- 按表示方法:是否有插头、括号法(广义括号法)、最小表示法
插头DP最朴素的实现就是用f[i][j][k]
记下在(i, j)
这个点轮廓线状态为k
的答案。空间上很大,所以一般用队列实现了。而且队列实现可以免去动规数组初始化的麻烦。队列实现需要一个hash,对于内存比较宽裕的题目,可以直接开一个桶解决。
参考资料
多回路问题
这类问题是最水的,只要记录当前位置有没有插头即可。比如说hdu1693
。
- 有上插头和左插头 → 没有右插头或下插头
- 没有上插头或做插头 → 有右插头和下插头
- 只有一个插头 → 右插头和下插头分别只有一个
单回路问题
这类问题得维护连通性使得只存在一个联通快。具体的做法课件上讲的很清楚。例题有:
- ural1519 Formula 1
- poj1739 (如果在外面加一圈障碍的话,就变成上面那题了)
- bzoj1187 (这题允许任意起点,并且不要求遍历全图)
限制起点终点的简单路径问题
简单路径问题按理来说应该用独立插头来解决,但是这类问题因为限制了起点和终点,所以比较好解决,只要对每个格子的类型进行判断,根据不同的格子进行不同的转移即可。比如说:
- poj3133 (这题网上都说是独立插头,但是直接特判格子就可以过掉了)
- poj1739 (这题如果不加一圈的话,用特判的方法还是很好写的)
hdu1693 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
|
ural1519 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
|
bzoj1187 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
|
poj3133 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
|