計蒜客 逃生(基礎動態規劃)

2021-08-17 18:47:19 字數 2149 閱讀 2465

蒜頭君在玩一款逃生的遊戲。在乙個 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 10

1 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 點血量,他...