計蒜客 逃生dp

2021-09-14 07:16:07 字數 1424 閱讀 1167

蒜頭君在玩一款逃生的遊戲。在乙個 n×m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。

蒜頭初始化有 v 點血量,他的血量上限是 c,任何時刻他的生命值都不能大於血量上限,如果血量為 0 則會死亡,不能繼續遊戲。

矩形地圖上的四個角(1,1),(1,m),(n,1),(n,m)為遊戲的出口。遊戲中只要選定了乙個出口,就必須朝著這個方向走。例如,選擇了左下的出口,就只能往左和下兩個方向前進,選擇了右上的出口,就只能往右和上兩個方向前進,左上和右下方向的出口同理。

如果成功逃生,那麼剩餘生命值越高,則遊戲分數越高。為了能拿到最高分,請你幫忙計算如果成功逃生最多能剩餘多少血量,如果不能逃生輸出 −1-1−1。

第一行依次輸入整數 n,m,x,y,v,c(1接下來 nnn 行,每行有 m 個數字,代表地圖資訊。(每個數字的絕對值不大於100,地圖中蒜頭君的初始位置的值一定為 0)

一行輸出乙個數字,代表成功逃生最多剩餘的血量,如果失敗輸出 −1。

樣例輸入

4 4 3 2 5 10

1 2 3 4

-1 -2 -3 -4

4 0 2 1

-4 -3 -2 -1

樣例輸出

#includeusing namespace std;

int n,m,x,y,v,c;

int val[1010][1010]=};

int dp[1010][1010]=};

int mixx=-0x3f3f3f3f;

void solve()

else if(i==x)

if(dp[i][j]>c)

}else if(j==y)

if(dp[i][j]>c)

}else if(jc)}}}

//右上

for(int i=x;i>=1;i--)

if(dp[i][j]>c)

}else if(j>y)

if(dp[i][j]>c)}}

} //左下

for(int i=x+1;i<=n;i++)

if(dp[i][j]>c)

}else if(jc)}}

}//右下

for(int i=x+1;i<=n;i++)

if(dp[i][j]>c)}}

} int t=max(dp[1][1],dp[1][m]);

t=max(t,dp[n][1]);

t=max(t,dp[n][m]);

if(t>0)

else

}int main()

} solve();

return 0;

}

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

蒜頭君在玩一款逃生的遊戲。在乙個 n times mn m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v...

藍橋杯 計蒜客之逃生

題幹 蒜頭君在玩一款逃生的遊戲。在乙個 n m 的矩形地圖上,蒜頭位於其中乙個點。地圖上每個格仔有加血的藥劑,和掉血的火焰,藥劑的藥效不同,火焰的大小也不同,每個格仔上有乙個數字,如果格仔上的數字是正數說明是乙個藥劑代表增加的生命值,如果是負數說明是火焰代表失去的生命值。蒜頭初始化有 v 點血量,他...

計蒜客 劃分整數(dp)

劃分整數 蒜頭君特別喜歡數學。今天,蒜頭君突發奇想 如果想要把乙個正整數 nn n 分解成不多於 kk k 個正整數相加的形式,那麼一共有多少種分解的方式呢?蒜頭君覺得這個問題實在是太難了,於是他想讓你幫幫忙。共一行,包含兩個整數 n 1 n 300 n 1 leq n leq 300 n 1 n ...