[백준] 2096 내려가기
직전에 풀었던 종만북의 Triangle Path문제랑 같은 원리로 풀어주면 된다.
하단부터 스멀스멀 올라오면서 최적해를 가져가면 된다
import java.util.*;
import java.io.*;
public class Main{
public static void main(String []args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] map = new int[n][3];
for(int i = 0 ; i < n ;i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < 3 ; j++){
map[i][j] = Integer.parseInt(st.nextToken());
}
}
// 최대값을 담을 변수
int[][] max = new int[n][3];
// 최솟값을 담을 변수
int[][] min = new int[n][3];
// 일단 최 하단 애들은 값 자체가 최대,최소값임
for(int i = 0 ; i < 3 ; i++){
max[n-1][i] = min[n-1][i] = map[n-1][i];
}
// 열 갯수가 3개로 고정이므로 머리쓰지 말고 그냥 쓰자 ^^
for(int i = n-2 ; i >= 0 ; i-- ){
// 아래 코드는 문제에 나오는 그림을 보면 이해할 수 있을것이다
max[i][0] = map[i][0] + Math.max(max[i+1][0], max[i+1][1]);
max[i][1] = map[i][1] + Math.max(max[i+1][0], Math.max(max[i+1][1], max[i+1][2]));
max[i][2] = map[i][2] + Math.max(max[i+1][1], max[i+1][2]);
min[i][0] = map[i][0] + Math.min(min[i+1][0], min[i+1][1]);
min[i][1] = map[i][1] + Math.min(min[i+1][0], Math.min(min[i+1][1], min[i+1][2]));
min[i][2] = map[i][2] + Math.min(min[i+1][1], min[i+1][2]);
}
int amax = 0;
int amin = 900001; // n 최대가 10만이고, 각 칸은 9가 최대이므로 900000이 최악임
for(int i = 0 ; i < 3 ; i++ ){
if(max[0][i] > amax) amax = max[0][i];
if(min[0][i] < amin) amin = min[0][i];
}
System.out.println(amax + " " + amin);
}
}
Comments