題目:
從左下角到右下角,生命值至少為多少,才可以保證騎士在行走的過程中至少保持生命值為1(只能向下或者向右走)
關鍵是每一步都要至少生命值為1。
所以並不是簡單的怎麼走的路徑和最大
我只知道題目,不知道具體輸入輸出的要求,有沒有說機試試有沒有ac,只是過了樣列,如果有人試了,求告訴我一下是不是有什麼bug或者對了,謝謝!
思路:定義dp[i][j][1]與dp[i][j][2]分別代表(i,j)位置的最小初始生命值與目前生命值的狀態;
再分別定義k1,p1代表從來上面到(i,j)的應該有的最小初始生命值與目前生命值的狀態;
k2,p2代表從左邊到(i,j)的應該有的最小初始生命值與目前生命值的狀態;
動態方程:最後取dp[i][j][1]=min(k1,k2);dp[i][j][2]=對應的p1或者p2;
具體的已經在注釋中有了
//*題目:
//*從左下角到右下角,生命值至少為多少,才可以保證騎士在行走的過程中至少保持生命值為1
//*關鍵是每一步都要至少生命值為1
#include
#include
#include
#include
#include
using
namespace std;
//todo 動態規劃之地牢遊戲
#define maxn 101
intmain()
} dp[1]
[1][
1]= map[1]
[1]>=0?
1:1- map[1]
[1];
//*初始化第乙個位置應該保持的生命值
dp[1]
[1][
2]= dp[1]
[1][
1]+ map[1]
[1];
//*其中dp[i][j][1]代表走到(i,j)位置時的最少初始生命值,dp[i][j][2]代表走到(i,j)位置時的狀態,如果小於1,則變成1
for(
int i =
2; i <= n; i++
)//*初始化第一行
else
}for
(int i =
2; i <= n; i++
)//*初始化第一列
else
}int k1, p1, k2, p2;
for(
int i =
2; i <= n; i++
)//*開始規劃
else
if(p2 + map[i]
[j]<1)
else
dp[i]
[j][1]
=min
(k1, k2);if
(dp[i]
[j][1]
== k1)
else}}
printf
("%d\n"
, dp[n]
[n][1]
);return0;
}
暗黑遊戲(動態規劃)
description 暗黑遊戲中,裝備直接決定玩家人物的能力。可以使用pg和rune購買需要的物品。暗黑市場中的裝備,每件有不同的 pg和rune 能力值 最大可購買件數。kid作為暗黑戰網的乙個玩家,當然希望使用盡可能少的pg和rune購買更優的裝備,以獲得最高的能力值。請你幫忙計算出現有支付能...
傳球遊戲 動態規劃
上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師再次吹哨子時,傳球停止,此時,拿著球沒傳出去的那個同學...
動態規劃 遊戲贏家(一)
給定乙個非負陣列,a b兩人玩遊戲,輪流從陣列的頭部或者尾部取出元素,加到各自的和中,直到陣列元素取完,取到的元素和最大的玩家贏。問對於給定的陣列,先開始的玩家能否保證贏得遊戲 如果相等也算先手的玩家贏 例如給定陣列為 1,5,233,7 a為開始第一步的玩家。a可以取1或者7,如果a先取1,剩下 ...