题目
分析
先记搜出每个格子往上下左右推一下能滑到哪里。然后类似于斯坦纳树,定义
d
p
[
l
]
[
r
]
[
x
]
[
y
]
dp[l][r][x][y]
dp[l][r][x][y] 表示把
l
∼
r
l \sim r
l∼r 的所有机器人搞到
(
x
,
y
)
(x, y)
(x,y) 合并的最小代价,区间 DP 外加四联通的转移,一种转移情况是
d
p
[
l
]
[
m
]
[
x
]
[
y
]
+
d
p
[
m
+
1
]
[
r
]
[
x
]
[
y
]
dp[l][m][x][y] + dp[m + 1][r][x][y]
dp[l][m][x][y]+dp[m+1][r][x][y],直接 DP 即可,另一种转移情况是从
(
x
,
y
)
(x, y)
(x,y) 的四联通格子
(
x
′
,
y
′
)
(x', y')
(x′,y′) 转移,即
d
p
[
l
]
[
r
]
[
x
′
]
[
y
′
]
dp[l][r][x'][y']
dp[l][r][x′][y′],显然会有环,这里是取
min
\min
min 因此使用 SPFA(如果是取
=
=
= 就高斯消元)。观察到边权(转移代价)都是
1
1
1,可以用 SPFA 的 01 图优化:开两个队列,一个存所有源点,另一个存被松弛后的点,每次取两者中小的一个 front
来松弛其他点,时间优化效果很显著。
代码
咕咕咕(调了 2 个小时最后打表过的,就不放了)。