給定乙個 \(n \times n\) 的方形網格,設其左上角為起點◎,座標\((1,1)\),\(x\) 軸向右為正, \(y\) 軸向下為正,每個方格邊長為 \(1\) ,如圖所示。
一輛汽車從起點◎出發駛向右下角終點▲,其座標為 \((n,n)\)。
在若干個網格交叉點處,設定了油庫,可供汽車在行駛途中加油。汽車在行駛過程中應遵守如下規則:
汽車只能沿網格邊行駛,裝滿油後能行駛 \(k\) 條網格邊。出發時汽車已裝滿油,在起點與終點處不設油庫。
汽車經過一條網格邊時,若其 \(x\) 座標或 \(y\) 座標減小,則應付費用 \(b\) ,否則免付費用。
汽車在行駛過程中遇油庫則應加滿油並付加油費用 \(a\)。
在需要時可在網格點處增設油庫,並付增設油庫費用 \(c\)(不含加油費用\(a\) )。
\(n,k,a,b,c\) 均為正整數, 且滿足約束: \(2\leq n\leq 100,2 \leq k \leq 10\)。 設計乙個演算法,求出汽車從起點出發到達終點所付的最小費用。
檔案的第一行是 \(n,k,a,b,c\) 的值。 第二行起是乙個\(n\times n\) 的 \(0-1\) 方陣,每行 \(n\) 個值,至 \(n+1\) 行結束。 方陣的第 \(i\) 行第 \(j\) 列處的值為 \(1\) 表示在網格交叉點 \((i,j)\) 處設定了乙個油庫,為 \(0\) 時表示未設油庫。各行相鄰兩個數以空格分隔。
程式執行結束時,輸出最小費用。
9 3 2 3 6
0 0 0 0 1 0 0 0 0
0 0 0 1 0 1 1 0 0
1 0 1 0 0 0 0 1 0
0 0 0 0 0 1 0 0 1
1 0 0 1 0 0 1 0 0
0 1 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 1 0
0 1 0 0 0 0 0 0 0
12
\(2 \leq n \leq 100,2 \leq k \leq 10\)
當你再讀這篇題解之前,請現將題目讀三邊!!!(貢獻我的\(wa\)
)其實這題的思路很簡單,就是乙個\(bfs+dp\)。
我們用\(dp[i][j][k]\)表示到達座標為\((i,j)\)的點時,剩餘能走\(k\)步時的最小花費,顯然狀態轉移方程為\(dp[i][j][k]=min(dp[i][j][k],cost)\)(\(cost\)為此時的花費)。
有注釋的**很簡單……
#include#include#includeusing namespace std;
const int n=120,maxk=20,inf=9999999;
const int zb[2][2]=,};//座標變換
int n,k,a,b,c,mp[n][n];//輸入用的
int dp[n][n][maxk];//狀態
struct node
;queueq;
int check(int x,int y)
int main()
); node top,next;
int cost;
while(!q.empty())
; if(check(next.x,next.y))
q.push(next);
}} for(int i=0;i<=1;++i)//和上面的差不多
; if(check(next.x,next.y))
q.push(next);
}} }
printf("%d\n",dp[n][n][0]);
return 0;
}
P4009 汽車加油行駛問題
看了很多題解,無論什麼解法都繞不開分層圖 在本題中加滿油的車每次可以移動k步,那麼我們就可以建立乙個k 1層的分層圖,表示汽車油量k的狀態 油量0 k 然後根據題目要求建圖 首先我們規定 k從1開始 第k層第i行第j列點編號為 k 1 n n i 1 n j 首先我們從第k層 i,j 建立一條邊到第...
P4009 汽車加油行駛問題
題意 給定乙個 n n n n 的方形網格,設其左上角為起點,座標為 1,1 1,1 x x 軸向右為正,y y 軸向下為正,每個方格邊長為 1 1 一輛汽車從起點出發駛向右下角終點 n,n n,n 在若干個網格交叉點處,設定了油庫。汽車在行駛過程中應遵守如下規則 汽車只能沿網格邊行駛,裝滿油後能行...
P4009 汽車加油行駛問題
傳送門 n和k都不大 可以跑分層圖 設dis i j k 表示從起點到座標為 i j 的點,還剩下可以跑 k 步的油時的最少花費 然後用 dijkstra 跑分層圖 走下一步時就分開來討論每種可能的操作 但是一定要注意每種操作的順序 先走,然後考慮走到的這點要不要設加油站,再考慮走到的這點有沒有加油...