하자 H[i, j]
은에서 시작할 때 플레이어가 필요로하는 최소한의 건강이라고 말합니다. 우리는 시작 광장에서 필요한 최소 건강 인 H[1, 1]
에 관심이 있습니다.
비용 매트릭스 M
의 모든 값이 정수라고 가정합니다. 그러므로 가장 작은 양의 건강 상태는 1입니다.
마지막 스퀘어를 스테핑하기 전에 필요한 건강 상태는 간단합니다. 해당 스퀘어 값이 양수이면 1이 필요하고 그렇지 않으면 빼기 수보다 적어도 더 많이 필요합니다.
M[m, i]
및
i
및
j
임의위한
M[j, n]
:
H[m, n] = max(1 - M[m, n], 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)
행렬의 중심에 우리가 오른쪽으로 추락 (모두 선택 사항이 현재 값이 음수이면 우리는 그렇지 않으면 우리는 그것을 줄일 수 있습니다 (그러나 결코 더 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