알고리즘

백준 15645번 내려가기2(JAVA)

박카스마시며코딩 2023. 2. 5. 19:08

https://www.acmicpc.net/problem/15645

 

15645번: 내려가기 2

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

www.acmicpc.net

 

 

 

package BOJ.dp;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.function.Function;

public class BOJ_15645 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        Function<String,Integer> stoi = Integer::parseInt;
        int n = stoi.apply(st.nextToken());
        int[][] map = new int[n][3];
        int[][] minDP = new int[n][3];
        int[][] maxDP = new int[n][3];
        for(int i = 0 ; i < n ; i++){
            st = new StringTokenizer(br.readLine());
            for(int j = 0 ; j < 3 ; j++){
                minDP[i][j] = NOT_VALID;
                maxDP[i][j] = NOT_VALID;
                map[i][j] = stoi.apply(st.nextToken());
            }
        }
        int min = INF;
        int max = 0;
        for(int i = 0 ; i < 3 ; i++){
            min = Math.min(min,findMin(0,i,map,n,minDP));
            max = Math.max(max,findMax(0,i,map,n,maxDP));
        }
        System.out.println(max + " " + min);
    }

    private static final int NOT_VALID = -1;
    private static final int INF = 987654321;

    private static int findMin(int y,int x, int[][] map, int n,int[][]dp) {
        if(y >= n){
            return 0;
        }
        if(dp[y][x] != NOT_VALID){
            return dp[y][x];
        }
        int result = INF;
        for(int i = -1 ; i <= 1 ; i++){
            int nx = x + i;
            if(nx >= 0 && nx < 3){
                result = Math.min(result,findMin(y+1,nx,map,n,dp));
            }
        }
        result += map[y][x];
        dp[y][x] = result;
        return result;
    }

    private static int findMax(int y,int x, int[][] map, int n,int[][] dp) {
        if(y >= n){
            return 0;
        }
        if(dp[y][x] != NOT_VALID){
            return dp[y][x];
        }
        int result = 0;
        for(int i = -1 ; i <= 1 ; i++){
            int nx = x + i;
            if(nx >= 0 && nx < 3){
                result = Math.max(result,findMax(y+1,nx,map,n,dp));
            }
        }
        result += map[y][x];
        dp[y][x] = result ;
        return result;
    }
}