[java]스티커 - 백준9465

문제



풀이

문제 해석을 하자면,

  • 2n개의 스티커 중에서 점수의 합이 최대가 되면서 서로 변을 공유 하지 않는 스티커 집합을 구해야 한다.


풀이

  • 브루트포스로 구현하기도 복잡하며, N 범위가 너무 크기 때문에 동적프로그래밍으로 접근한다.

  • DP 점화식 -> 아래 그림 참고

    • dp[0][i] = Math.max(dp[1][i - 1] + inArr[0][i], dp[1][i - 2] + inArr[0][i]);
      dp[1][i] = Math.max(dp[0][i - 1] + inArr[1][i], dp[0][i - 2] + inArr[1][i]);
      


점화식 구하는 과정

image



코드

public static void main(String[] args) throws IOException {
    StringBuilder sb =new StringBuilder();
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int T = Integer.parseInt(br.readLine());
    for (int t = 0; t < T; t++) {
        int N = Integer.parseInt(br.readLine());
        int[][] inArr = new int[2][N + 1];
        StringTokenizer stk = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < N; i++) {
            inArr[0][i] = Integer.parseInt(stk.nextToken());
        }
        stk = new StringTokenizer(br.readLine(), " ");
        for (int i = 0; i < N; i++) {
            inArr[1][i] = Integer.parseInt(stk.nextToken());
        }
        //run
        //dp init
        int[][] dp = new int[2][N + 1];
        dp[0][0] = inArr[0][0];
        dp[1][0] = inArr[1][0];
        dp[0][1] = inArr[1][0]+inArr[0][1];
        dp[1][1] = inArr[0][0]+inArr[1][1];
        //dp
        for (int i = 2; i < N; i++) {
            dp[0][i] = Math.max(dp[1][i - 1] + inArr[0][i], dp[1][i - 2] + inArr[0][i]);
            dp[1][i] = Math.max(dp[0][i - 1] + inArr[1][i], dp[0][i - 2] + inArr[1][i]);
        }
        //output
        sb.append(Math.max(dp[0][N - 1], dp[1][N - 1])).append("\n");
    }
    System.out.println(sb);
}



느낀점

생략

댓글남기기