这道题正解是插头DP。
既然是用DP就要考虑状态转移:
-
首先,由于插头DP是从 (1,1)(1,1) 到 (n,n)(n,n),而题目要求从 (1,n)(1,n) 到 (n,1)(n,1),所以要将地图上下镜像对称一下,以便使用插头DP。
-
接着,因为题目要我们找出一条从起点到终点的路径,所以我们想到在起点建一个插头,若DP到终点时也有且只有一个相同的插头指向终点,则状态为合法。
-
然后考虑状态转移,这里使用 “括号匹配法” :
设 upup 为当前格子的上方的括号, leftleft 为当前格子左边的括号,用 11 表示左括号, 22 表示右括号。(如图下)
黑色的是轮廓线,绿色的是当前格子。
- 若 upup 和 leftleft 都为 00 (没插头),那么这个格子可以走,也可以不走,若走则在下方和右方新建一个插头(在代码中则是加入一对匹配括号),并将此状态路过格数加一,不走则不做改动。(如图下)
这是走的。
这是不走。
- 若只有一个方向有插头,由于是一条路,所以这个插头必须接,但出口有两个方向,一个向下,一个向右,对于每种情况都要在相对位置建插头,插头(括号)类型与 up/leftup/left 插头类型一样。(图只给了从上方来的,从左边来的同理)