알고리즘

백준 9465번 스티커 (JAVA)

박카스마시며코딩 2023. 12. 25. 23:18

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

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의

www.acmicpc.net

 

저는 DP를 이용해 문제를 풀었습니다.

DP를 통해 이전에 계산했던 것을 다시 계산하지 않도록 하여 문제를 풀었습니다.

 

package BOJ.dp;

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

public class BOJ_9465 {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int testCnt = Integer.parseInt(br.readLine());
        for(int t = 0 ; t < testCnt ; t++){
            int m = Integer.parseInt(br.readLine());
            int[][] map = new int[2][m];
            int[][] dp = new int[2][m];
            for(int i = 0 ; i < 2 ; i++){
                StringTokenizer st = new StringTokenizer(br.readLine());
                for(int j = 0 ; j < m ; j++){
                    dp[i][j] = NOT_VALID;
                    map[i][j] = Integer.parseInt(st.nextToken());
                }
            }
            int result = Math.max(cal(1,0,map,2,m,dp),cal(0,0,map,2,m,dp));
            System.out.println(result);
        }
    }
    private static final int[] DY = {-1,0,1};
    private static final int[] DX = {0,1,0};
    private static final int NOT_VALID = -1;
    private static int cal(int y, int x, int[][] map, int n, int m,int[][] dp) {
        if(x >= m){
            return 0;
        }
        if(dp[y][x] != NOT_VALID){
            return dp[y][x];
        }
        int result = 0;
        result = Math.max(result, cal((y+1)%2,x+2,map,n,m,dp));
        result = Math.max(result, cal((y+1)%2,x+1,map,n,m,dp));
        result += map[y][x];
        dp[y][x] = result;
        return result;
    }
}