蒜頭君在玩一款逃生的遊戲。在乙個 n \times mn×
m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。
蒜頭初始化有 v
v 點血量,他的血量上限是 c
c,任何時刻他的生命值都不能大於血量上限,如果血量為 0
0 則會死亡,不能繼續遊戲。
矩形地圖上的四個角(1, 1)(1
,1),(1, m)(1
,m),(n, 1)(n
,1),(n, m)(n
,m)為遊戲的出口。遊戲中只要選定了乙個出口,就必須朝著這個方向走。例如,選擇了左下的出口,就只能往左和下兩個方向前進,選擇了右上的出口,就只能往右和上兩個方向前進,左上和右下方向的出口同理。
如果成功逃生,那麼剩餘生命值越高,則遊戲分數越高。為了能拿到最高分,請你幫忙計算如果成功逃生最多能剩餘多少血量,如果不能逃生輸出 -1−1
。第一行依次輸入整數 nn,m
m,xx,y
y,vv,c
c(1 < n,m \leq 1000
1m≤10
00,1 \leq x \leq n1≤
x≤n,1 \leq y \leq m1≤
y≤m,1 \leq v \leq c \leq 100001≤
v≤c≤
1000
0), 其中 n, mn,
m 代表地圖大小,(x, y)(x
,y) 代表蒜頭君的初始位置,v
v 代表蒜頭的初始化血量,c
c代表蒜頭的生命值上限。
接下來 n
n 行,每行有 m
m 個數字,代表地圖資訊。(每個數字的絕對值不大於10010
0,地圖中蒜頭君的初始位置的值一定為 00)
一行輸出乙個數字,代表成功逃生最多剩餘的血量,如果失敗輸出 -1−1
。樣例輸入
4 4 3 2 5 101 2 3 4
-1 -2 -3 -4
4 0 2 1
-4 -3 -2 -1
樣例輸出
10
思路: 將4中出口的結果都存起來 取最大值即可 每一種解法利用動態規劃求解
注意.1、如果同行同列 代表起點 跳過 不進行處理
2、若與起點同行或者與起點同列 則到達該點的方式只有一種
3、若某點的值大於給定最大值 則應重置該點的值 如小於0 則賦給乙個很小的數字 (以防加其他項變正 出現錯解)
狀態轉移方程 tmp[i][j]=max("可以到達該點的兩種方式的較大值")+該點的值;
ac**:
#include #include #include using namespace std;
int n,m,x,y,v,c,dp[1010][1010],tmp[1010][1010];
int main()
// 左上
memset(tmp,0,sizeof(tmp));
tmp[x][y]=v;
for(int i=x;i>=1;i--)
} a.push_back(tmp[1][1]);
//右上
memset(tmp,0,sizeof(tmp));
tmp[x][y]=v;
for(int i=x;i>=1;i--)
} a.push_back(tmp[1][m]);
//左下
memset(tmp,0,sizeof(tmp));
tmp[x][y]=v;
for(int i=x;i<=n;i++)
} a.push_back(tmp[n][1]);
//右下
memset(tmp,0,sizeof(tmp));
tmp[x][y]=v;
for(int i=x;i<=n;i++)
} a.push_back(tmp[n][m]);
sort(a.begin(),a.end());
if(a[3]>=0)
cout
cout<<-1;
return 0;
}
逃生 計蒜客 動態規劃基礎
雖長,但核心思想不難,基礎的動態規劃問題。提交後6個樣例裡通過了5個,覺得演算法應該沒問題的。找了一上午都沒發現問題原因。最後還是將所有資料全部列印出來,才發現在for迴圈這裡出了大問題。是在處理右下塊的時候誤將for int i x 1 i n i 寫成了for int i x 1 i 1 i 不...
計蒜客 逃生dp
蒜頭君在玩一款逃生的遊戲。在乙個 n m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v 點血量,他的血量...
藍橋杯 計蒜客之逃生
題幹 蒜頭君在玩一款逃生的遊戲。在乙個 n m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v 點血量,他...