左神演算法 龍與地下城遊戲

2021-08-15 04:48:37 字數 1607 閱讀 6265

【題目】給定乙個二維陣列map,含義是一張地圖,例如,如下矩陣

-2 -3 3

-5 -10 1

0 30 -5

遊戲規則如下:騎士從左上角出發,每次只能向右或者向下走,最後到到右下角見到公主。

地圖中每隔位置代表騎士要遭遇的事情,如果是負數,騎士損失血量,如果是非負數,能讓騎士回血。

騎士從左上角到右下角的過程中,走到任何乙個位置,血量都不能少於1。

動態規劃解法

下面想的是錯誤的解法,把問題想簡單了。這個做法從左上到坐下相當於在收集能量,如果求騎士能收集的最多能量是多少,就用這個方法。

public static int minhp(int m)

int dp = new int[m.length][m[0].length];

dp[0][0] = m[0][0];

for (int i = 1; i < m[0].length; i++)

for (int i = 1; i for (int i = 1; i }

return dp[m.length-1][m[0].length-1] ;

//return dp[m.length-1][m[0].length-1] > 0? 0: -dp[m.length -1][m[0].length-1];

}

這裡要保證騎士每個位置上的血量都不少於1,如果還是從開始位置出發,遞推的話發現會有問題。

如果此處dp[i][j]表示要到達位置(i,j)從坐上角出發至少需要多少能量,不能從dp[i-1][j]和dp[i][j-1]推導出dp[i][j],因為如果map[i][j]處是個負數,那我還需要知道走到map[i-1][j]時還有多少能量,如果能量和該處值之和大於1,說明不用增加需要的能量。

所以此處應該從右下角開始往左上角推,右下角的值是-5,由此推出這裡的值起碼是6。然後推得最後一行和最後一列的值。

然後從右往左,從下往上遞推,dp[i][j]表示從位置(i,j)走到右下角,至少需要多少血量。它是從dp[i+1][j]和dp[i][j+1]演化過來,取它們的較小值記做min,說明走(i,j)之後,知道要有min血量。這時就用min-map[i][j],如果值大於等於1,說明此處還需要血量這麼多,如果血量小於1,說明此處是不需要血量的,但是每乙個都需要血量不少於1,這時血量就是1;

public static int minhp1(int m)

int row = m.length;

int col = m[0].length;

int dp = new int[row][col];

dp[row-1][col-1] = m[row-1][col-1] >= 0? 1: -m[m.length-1][m[0].length-1] +1;

for (int i = col -2; i >= 0; i--)

for (int i = row -2; i >= 0; i--)

for (int i = row-2; i >= 0 ; i--)

}return dp[0][0];

}

得出的dp陣列如下

7 5 2

6 11 5

1 1 6

龍與地下城遊戲問題

題目 給定乙個二維陣列,含義是一張地圖,例如,如下矩陣 int data 遊戲規則如下 1.騎士從左上角出發,每次只能向下或向右走,最後達到右下角見到公主。2.地圖中每個位置代表騎士血量的變化,若為負數,則表示有怪獸掉血 若為整數,則表示有血包,增加了血量 3.騎士走到任何乙個位置,血量都不能少於1...

龍與地下城遊戲問題

題目 給定乙個二維陣列map,含義是一張地圖,例如,如下矩陣 2 3 3 5 10 1 0 30 5 遊戲的規則如下 騎士從左上角出發,每次只能向右或向下走,最後到達右下角見到公主。地圖中每個位置的值代表騎士要遭遇的事情。如果是負數,說明此處有怪獸,要讓騎士損失血量。如果是非負數,代表此處有血瓶,能...

龍與地下城遊戲問題

題目 給定乙個二維陣列map,含義是一張地圖,例如如下,矩陣 2 3 3 5 10 1 0 30 5 遊戲規則如下 騎士從左上角出發,每次只能向右或者向下走,最後到達右下角見到公主。地圖中每個位置的只代表騎士要遭遇的事。如果是負數,表示此處有怪獸,要讓騎士損失血量。如果是非負數,表示此處有血瓶,能讓...