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]);
                    }
                }
            }
        }
    }
	```
posted @ 2023-05-15 21:31  腾云今天首飞了吗  阅读(43)  评论(0编辑  收藏  举报