📙 Algorithm Solving/Java

📙[Algo] 24.06.26 알고리즘

혜덕hyeduck 2024. 6. 26. 23:25

알고리즘 문제) BOJ 9465. 스티커

코드

import java.io.*;
import java.util.*;

/*
 변을 공유하지 않으며 스티커를 선택해서
 최대 점수 구하기

 스티커는 총 2N개,
 한 줄에 N개씩 스티커가 주어짐

 */

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

    static int recur(int cur, int row) {
        if (cur == N) return 0;

        if (dp[cur][row] != -1) return dp[cur][row];

        int ret = 0;
        if (row == 0) {
            // 이전 열에서 아무 스티커도 선택하지 않은 경우

            // 1행의 스티커 선택
            ret = Math.max(ret, recur(cur + 1, 1) + arr[1][cur]);

            // 2행의 스티커 선택
            ret = Math.max(ret, recur(cur + 1, 2) + arr[2][cur]);

            // 아무 스티커도 선택 X
            ret = Math.max(ret, recur(cur + 1, 0));

        } else if (row == 1) {
            // 이전 열에서 1행의 스티커 선택

            // 2행의 스티커 선택
            ret = Math.max(ret, recur(cur + 1, 2) + arr[2][cur]);

            // 아무 스티커도 선택 X
            ret = Math.max(ret, recur(cur + 1, 0));
        } else {
            // 이전 열에서 2행의 스티커 선택

            // 1행의 스티커 선택
            ret = Math.max(ret, recur(cur + 1, 1) + arr[1][cur]);

            // 아무 스티커도 선택 X
            ret = Math.max(ret, recur(cur + 1, 0));
        }

        dp[cur][row] = ret;
        return ret;
    }

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

        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();
        while (T-- > 0) {
            N = Integer.parseInt(br.readLine());
            arr = new int[3][N];
            for (int i = 1; i <= 2; i++) {
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < N; j++) {
                    arr[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            dp = new int[N][3];
            for (int[] d : dp) {
                Arrays.fill(d, -1);
            }

            sb.append(recur(0, 0)).append("\\n");
        }

        System.out.println(sb);
    }
}