μ΅œλŒ€ 1 λΆ„ μ†Œμš”

πŸ“ [S1_1932] μ •μˆ˜ μ‚Όκ°ν˜•

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static StringTokenizer st;
    static int[][] arr;
    static int[][] dp;
    static int N;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // μ‚Όκ°ν˜• 크기
        N = Integer.parseInt(br.readLine());

        // μ‚Όκ°ν˜• κ°’λ“€
        arr = new int[N][N];

        dp = new int[N + 1][N + 1];

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            for (int j = 0; j <= i; j++) {
                arr[i][j] = Integer.parseInt(st.nextToken());
            }
        }

        for (int i = N - 1; i >= 0; i--) {
            for (int j = i; j >= 0; j--) {
                // dp 배열에 2값을 λΉ„κ΅ν•΄μ„œ 큰 κ°’κ³Ό 본인 값을 λ”ν•΄μ„œ dp에 μ €μž₯ν•œλ‹€
                dp[i][j] = Math.max(dp[i + 1][j], dp[i + 1][j + 1]) + arr[i][j];
            }
        }
        System.out.println(dp[0][0]);
    }
}

πŸ€” λ‚˜μ˜ 생각

DP λ¬Έμ œμ΄λ‹€.
일단 N이 500개 κΉŒμ§€ 있기 λ•Œλ¬Έμ— DP둜 ν‘ΈλŠ” 것을 μ•Œμ•˜λ‹€.
그림을 κ·Έλ €λ³΄μ•˜μ„ λ•Œ ν•œ ν–‰ 밑에 κ°’κ³Ό ν•œ ν–‰ λ°‘μ˜ 였λ₯Έμͺ½ κ°’κ³Ό λΉ„κ΅ν•΄μ„œ 더 큰 값을 본인 κ°’κ³Ό 더해주면 λ˜λŠ” κ·œμΉ™μ„ λ°œκ²¬ν•˜μ˜€λ‹€.
이진 트리의 κ΅¬μ‘°λΌμ„œ μ‰½κ²Œ 이해할 수 μžˆμ—ˆλ‹€.
ν™•μ‹€νžˆ 빨리 κ·œμΉ™μ„ μ°ΎλŠ”κ²Œ μ€‘μš”ν•œ 것 κ°™λ‹€ !!