讓我們說H[i, j]
是從廣場(i, j)
開始玩家需要的最低健康值。我們對H[1, 1]
感興趣,這是起始廣場所需的最低健康水平。
我假設成本矩陣M
中的所有值都是整數。因此,最小的正健康是1
踩着最後的廣場前的衛生要求很簡單:如果在該廣場是正值,我們需要1,否則,我們至少需要比被減去更多:
H[m, n] = max(1 - M[m, n], 1)
其他簡單的是基體的邊緣:和M[m, i]
M[j, n]
任意i
和j
。如果當前值是負的,我們必須增加所需的健康緩衝,否則我們可以減少它(但從來沒有進一步比1):
H[m, i] = max(H[m, i+1] - M[m, i], 1)
H[j, n] = max(H[j+1, n] - M[j, n], 1)
在矩陣的中心,我們有兩個選擇(會向右和向下),所以我們採取這些替代品的最低限度:
H[i, j] = min(max(H[i, j+1] - M[i, j], 1),
max(H[i+1, j] - M[i, j], 1))
就是這樣!這個轉換爲代碼很簡單(假設M
,m
和n
給出和M
是基於1):
int[] H = new int[m, n];
H[m, n] = max(1 - M[m, n], 1);
// remember to loop backwards
for (int i = m-1; i >= 1; i--)
H[m, i] = max(H[m, i+1] - M[m, i], 1);
for (int j = n-1; j >= 1; j--)
H[j, n] = max(H[j+1, n] - M[j, n], 1);
// again, loop backwards
for (int i = m-1; i >= 1; i--)
for (int j = n-1; j >= 1; j--)
H[i, j] = min(max(H[i, j+1] - M[i, j], 1),
max(H[i+1, j] - M[i, j], 1));
return H[1, 1];
你要限制的動作?如果玩家可以在所有4個方向上移動,則不能使用動態編程。而且,如果允許所有方向移動,如果前兩個單元格都是正數,則可以得到簡單的解決方案:只需來回移動,直到緩衝區足夠高,以便能夠直接通向出口。 –
對不起,錯過了。他只能向右(i + 1,j)或向下(i,j + 1) – Aks