알고리즘
bj2096(내려가기)-dp
쥐4
2025. 5. 25. 03:27
https://www.acmicpc.net/problem/2096
메모리가 4MB이다.
빡세다. 이런 문제는 풀지 말자. 코테에 안나온다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int N;
static int[] max_dp;
static int[] min_dp;
static StringTokenizer stringTokenizer;
static BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
initialize();
int[] answers = solve();
System.out.println(answers[0] + " " + answers[1]);
}
private static void initialize() throws IOException {
N = Integer.parseInt(bufferedReader.readLine());
max_dp = new int[3];
min_dp = new int[3];
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
for (int x = 0; x < 3; x++) {
int num = Integer.parseInt(stringTokenizer.nextToken());
max_dp[x] = num;
min_dp[x] = num;
}
}
private static int[] solve() throws IOException {
for (int y = 1; y < N; y++) {
int[] currMax = new int[3];
int[] currMin = new int[3];
for (int x = 0; x < 3; x++) {
currMax[x] = Integer.MIN_VALUE;
currMin[x] = Integer.MAX_VALUE;
}
if(N != 1){
stringTokenizer = new StringTokenizer(bufferedReader.readLine());
int[] row = new int[3];
for (int x = 0; x < 3; x++) {
row[x] = Integer.parseInt(stringTokenizer.nextToken());
}
for (int x = 0; x < 3; x++) {
for (int i = -1; i <= 1; i++) {
int nx = x + i;
if (nx < 0 || nx >= 3) continue;
currMax[x] = Math.max(currMax[x], max_dp[nx] + row[x]);
currMin[x] = Math.min(currMin[x], min_dp[nx] + row[x]);
}
}
max_dp = currMax;
min_dp = currMin;
}
}
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int x = 0; x < 3; x++) {
max = Math.max(max, max_dp[x]);
min = Math.min(min, min_dp[x]);
}
return new int[]{max, min};
}
}