Algorithm

[Algo] 백준 23029 시식 코너는 나의 것 JAVA

조핑구 2024. 5. 7. 16:38

문제 바로가기 : https://www.acmicpc.net/problem/23029

메모리 : 27184KB

시간 : 252ms

언어 : Java 11


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

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[] arr = new int[100001];
        for (int i = 1; i <= N; i++) {
            arr[i] = Integer.parseInt(br.readLine());
        }
        long[][] dp = new long[100001][3]; // 1턴 2턴 3턴
        dp[1][0] = 0;
        dp[1][1] = dp[1][2] = arr[1];
        dp[2][0] = arr[2];
        dp[2][1] = arr[1] + arr[2] / 2;
        dp[2][2] = arr[1];
        long ans = Math.max(dp[2][0], dp[2][1]);
        for (int i = 3; i <= N; i++) {
            dp[i][0] = dp[i - 1][2] + arr[i]; // 첫번째 다먹기
            dp[i][1] = dp[i - 1][0] + arr[i] / 2; // 두번째 절반먹기
            dp[i][2] = Math.max(Math.max(dp[i - 1][1], dp[i - 1][2]), dp[i - 1][0]); // 세번째 쉬어가기
        }
        ans = Math.max(Math.max(dp[N][0], dp[N][1]), dp[N][2]);
        System.out.println(ans);
    }
}

풀이

1번째, 2번째, 3번째 시식에서의 행동이 다르니 2차원 DP에 저장해주며 그 중 가장 큰 수만을 저장한다.

세 칸이 한 풀이에 사용되므로 1차원 dp로도 해결 가능한 문제였다.

0 1 2 3
O X O O
X O X O
X X O O

다음과 같이 먹을 수 있기 떄문에 이를 점화식을 써서 풀면 1차원 배열로도 풀 수 있다.