用d[i][j][k]表示走到第(i,j)格,在不彈射的情況下還能再走k步的最小花費,那麼有轉移:
d[i][j][k]->d[x][y][k-1],其中(i,j)和(x,y)相鄰或相等,k>0,表示走到相鄰一格或不走;
d[i][j][0]+a[i][j]->d[x][y][b[i][j]],表示一次彈射。
注意樣例輸入的a,b陣列相反?另外聽說卡spfa?
ac**如下:
#include#include#include#include#include#define n 155
#define inf 1000000000
using namespace std;
const int dx[4]=,dy[4]=;
int m,n,len,x1,x2,x3,y1,y2,y3,t1,t2,t3,a[n][n],b[n][n],d[n][n][n<<1];
bool vis[n][n][n<<1];
struct node;
priority_queueq;
bool operator <(node u,node v)
void solve(int sx,int sy)
d[sx][sy][0]=0;
node u,v; u.x=sx; u.y=sy; u.z=u.d=0; q.push(u);
while (!q.empty() && !(vis[x1][y1][0] && vis[x2][y2][0] && vis[x3][y3][0])){
u=q.top(); q.pop();
if (vis[u.x][u.y][u.z]) continue; vis[u.x][u.y][u.z]=1;
if (u.z){
for (k=0; k<4; k++){
i=u.x+dx[k]; j=u.y+dy[k];
if (i>0 && i<=m && j>0 && j<=n && u.d
by lych
2016.3.4
bzoj 2143 飛飛俠 最短路
解題思路 這道題點很少,但是邊可能很多,直接建圖做最短路顯然不可行。但是如果把彈射看成獲得了可以走a i j 的能量。這樣就可以直接最短路了。每走一格可看作消耗1的能量,f i j k 表示在i,j這個點且有k的能量的最少費用。每次只要向四個方向走,或者原地不動即可。做三次最短路即可。include...
BZOJ 2143 飛飛俠 最短路
description 飛飛國是乙個傳說中的國度,國家的居民叫做飛飛俠。飛飛國是乙個n m的矩形方陣,每個格仔代表乙個街區。然而飛飛國是沒有交通工具的。飛飛俠完全靠地面的彈射裝置來移動。每個街區都裝有彈射裝置。使用彈射裝置是需要支付一定費用的。而且每個彈射裝置都有自己的彈射能力。我們設第i行第j列的...
BZOJ2143 飛飛俠 最短路
description 給出兩個 n m 的矩陣 a,b,以及 3 個人的座標 在 i,j 支付 ai,j 的費用可以彈射到曼哈頓距離不超過 bi,j 的位置 問三個人匯合所需要的最小總費用 sample input 4 4 0 0 0 0 1 2 2 0 0 2 2 1 0 0 0 0 5 5 5...