Lewis's Tech Keep

[백준] 내려가기 본문

JAVA/알고리즘

[백준] 내려가기

Lewis Seo 2021. 4. 7. 17:10

참고 : www.acmicpc.net/problem/2096

 

2096번: 내려가기

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

www.acmicpc.net

 

- dp 문제

- dp[i][0] : dp[i-1][0] + dp[i-1][1] ( = i-1번째의 최소값, 최대값 (0번, 1번이 해당 i번째로 이동가능)) + s[i][0] 

- dp[i][1] : dp[i-1][0] + dp[i-1][1] + dp[i-1][2] ( = i-1번째의 최소값, 최대값 (0번, 1번, 2번이 해당 i번째로 이동가능)) + s[i][1] 

- dp[i][2] : dp[i-1][1] + dp[i-1][2] ( = i-1번째의 최소값, 최대값 (1번, 2번이 해당 i번째로 이동가능)) + s[i][2] 

 

더보기
import java.util.*;

public class Solution {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        int[][] s = new int[N+1][3];
        int[][] dpMin = new int[N+1][3];
        int[][] dpMax = new int[N+1][3];
        for (int i = 1; i <= N; i++) {
            s[i][0] = sc.nextInt();
            s[i][1] = sc.nextInt();
            s[i][2] = sc.nextInt();
        }

        for (int i = 1; i <= N; i++) {
            // 최소 dp
            dpMin[i][0] = Math.min(dpMin[i-1][0], dpMin[i-1][1]) + s[i][0];
            dpMin[i][1] = Math.min(dpMin[i-1][0], Math.min(dpMin[i-1][1], dpMin[i-1][2])) + s[i][1];
            dpMin[i][2] = Math.min(dpMin[i-1][1], dpMin[i-1][2]) + s[i][2];
            // 최대 dp
            dpMax[i][0] = Math.max(dpMax[i-1][0], dpMax[i-1][1]) + s[i][0];
            dpMax[i][1] = Math.max(dpMax[i-1][0], Math.max(dpMax[i-1][1], dpMax[i-1][2])) + s[i][1];
            dpMax[i][2] = Math.max(dpMax[i-1][1], dpMax[i-1][2]) + s[i][2];
        }
        System.out.print(Math.max(dpMax[N][0], Math.max(dpMax[N][1], dpMax[N][2])));
        System.out.print(" ");
        System.out.print(Math.min(dpMin[N][0], Math.min(dpMin[N][1], dpMin[N][2])));
    }
}

'JAVA > 알고리즘' 카테고리의 다른 글

[프로그래머스] 길찾기 게임  (0) 2021.04.12
[백준] 줄세우기(2631)  (0) 2021.04.08
[백준] 최단경로  (0) 2021.04.07
[백준] 암호코드  (0) 2021.04.05
[백준] 1,2,3 더하기  (0) 2021.04.05
Comments