動態規劃學習之地牢遊戲

2021-10-04 12:45:59 字數 1534 閱讀 8047

題目:

從左下角到右下角,生命值至少為多少,才可以保證騎士在行走的過程中至少保持生命值為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,剩下 ...