abc301 E
正解状压dp + 最短路。
一开始是考虑的直接dp,但是这个题里是可以向四个方向移动的,因此普通的dp就具有后效性,搞了很久也没搞出转移方程。
题目中虽然地图范围较大,但是糖果数很少。因此可以最短路算出糖果两两间的距离和他们到终点/起点的距离。
剩下的就是状压dp了。
设 \(dp[i][j]\) 为状态为 \(2\) 时,最后一步走到第 \(j\) 个糖果所需要的最短路径。 \(i\) 即为压缩的状态,某一位为 \(1\) 则表示拿这个糖果。
于是状态转移如下:
for (int i = 0; i < 1 << cnt + 2; i++){
for (int j = 0; j <= cnt + 1; j++){
if (i & 1 << j){
for (int k = 0; k <= cnt + 1; k++){
if ((i ^ 1 << j) & 1 << k){
dp[i][j] = min(dp[i][j],dp[i ^ 1 << j][k] + dis[k][j]);
}
}
}
}
}
```