(1회차 시도 성공!)
[3차원 배열 DP 풀이]
import java.io.*;
import java.util.*;
/**
* 풀이 과정:
* - 고민과 풀이:
*
* - 문제 해결:
*
* 시간복잡도: O()
* 공간복잡도: O()
*
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[][][] dp = new int[n][3][2];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 3; j++) {
int a = Integer.parseInt(st.nextToken());
dp[i][j][0] = a;
dp[i][j][1] = a;
}
}
for (int i = 1; i < n; i++) {
dp[i][0][0] = Math.max(dp[i-1][0][0], dp[i-1][1][0]) + dp[i][0][0];
dp[i][1][0] = Math.max(dp[i-1][0][0], Math.max(dp[i-1][1][0], dp[i-1][2][0])) + dp[i][1][0];
dp[i][2][0] = Math.max(dp[i-1][1][0], dp[i-1][2][0]) + dp[i][2][0];
dp[i][0][1] = Math.min(dp[i-1][0][1], dp[i-1][1][1]) + dp[i][0][1];
dp[i][1][1] = Math.min(dp[i-1][0][1], Math.min(dp[i-1][1][1], dp[i-1][2][1])) + dp[i][1][1];
dp[i][2][1] = Math.min(dp[i-1][1][1], dp[i-1][2][1]) + dp[i][2][1];
}
bw.write(Math.max(Math.max(dp[n-1][0][0], dp[n-1][1][0]), dp[n-1][2][0])+" "
+ Math.min(Math.min(dp[n-1][0][1], dp[n-1][1][1]), dp[n-1][2][1]));
br.close();
bw.close();
}
}
[2차원 배열 DP 2개 활용 풀이]
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[][] maxDp = new int[n][3];
int[][] minDp = new int[n][3];
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 3; j++) {
int a = Integer.parseInt(st.nextToken());
maxDp[i][j] = a;
minDp[i][j] = a;
}
}
for (int i = 1; i < n; i++) {
maxDp[i][0] = Math.max(maxDp[i-1][0], maxDp[i-1][1]) + maxDp[i][0];
maxDp[i][1] = Math.max(maxDp[i-1][0], Math.max(maxDp[i-1][1], maxDp[i-1][2])) + maxDp[i][1];
maxDp[i][2] = Math.max(maxDp[i-1][1], maxDp[i-1][2]) + maxDp[i][2];
minDp[i][0] = Math.min(minDp[i-1][0], minDp[i-1][1]) + minDp[i][0];
minDp[i][1] = Math.min(minDp[i-1][0], Math.min(minDp[i-1][1], minDp[i-1][2])) + minDp[i][1];
minDp[i][2] = Math.min(minDp[i-1][1], minDp[i-1][2]) + minDp[i][2];
}
bw.write(Math.max(Math.max(maxDp[n-1][0], maxDp[n-1][1]), maxDp[n-1][2])+" "
+ Math.min(Math.min(minDp[n-1][0], minDp[n-1][1]), minDp[n-1][2]));
br.close();
bw.close();
}
}