[백준] 17484: 진우의 달 여행 (Small) - JAVA
in Algorithm on 다이나믹 프로그래밍
https://www.acmicpc.net/problem/17484
풀이
맨 위에서 맨 아래로 내려가야 한다.
아래로 내려갈 때는 5시, 6시, 7시 방향으로 내려갈 수 있다.
하지만 이전에 5시방향으로 내려왔다면 다시 5시방향으로 내려갈 수 없다.
다른 방향들도 같은 방식으로 진행한다.
따라서 dp배열을 삼차원 배열으로 만들어 방향까지 저장해주었다.
메모리: 14320KB
시간: 124ms
언어: Java 11
코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[][] arr = new int[n][m];
int[][][] dp = new int[n][m][3];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < m; j++) {
arr[i][j] = Integer.parseInt(st.nextToken());
Arrays.fill(dp[i][j], 1000001);
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < 3; j++) {
dp[0][i][j] = arr[0][i];
}
}
for (int i = 1; i < n; i++) {
for (int j = 0; j < m; j++) {
if (j == 0) {
dp[i][j][0] = Math.min(dp[i - 1][j + 1][1], dp[i - 1][j + 1][2]) + arr[i][j];
dp[i][j][1] = dp[i - 1][j][0] + arr[i][j];
} else if (j == m - 1) {
dp[i][j][1] = dp[i - 1][j][2] + arr[i][j];
dp[i][j][2] = Math.min(dp[i - 1][j - 1][1], dp[i - 1][j - 1][0]) + arr[i][j];
} else {
dp[i][j][0] = Math.min(dp[i - 1][j + 1][1], dp[i - 1][j + 1][2]) + arr[i][j];
dp[i][j][1] = Math.min(dp[i - 1][j][0], dp[i - 1][j][2]) + arr[i][j];
dp[i][j][2] = Math.min(dp[i - 1][j - 1][0], dp[i - 1][j - 1][1]) + arr[i][j];
}
}
}
int ans = Integer.MAX_VALUE;
for (int i = 0; i < m; i++) {
for (int j = 0; j < 3; j++) {
ans = Math.min(dp[n - 1][i][j], ans);
}
}
System.out.println(ans);
}
}