Tech Log 🛠️

백준 9465) 스티커 java 본문

알고리즘

백준 9465) 스티커 java

sehaan 2023. 2. 27. 23:47

분석


스티커를 떼어내면 맞붙어 있는 스티커는 못쓴다고 했으므로 각 스티커당 경우의 수는 두가지이다.

 

1.여기 스티커를 떼면 3.여기 불가능 5.경우의 수 포함 x
2.여기 불가능 4.여기 가능(경우1) 6.여기 가능(경우2)

예를 들어 1번 스티커를 떼면 4번 스티커 , 6번 스티커를 뗄 수 있다.

5번은 경우의 수에 포함시키 않았는데 1-> 4 ->5 로 가는 경로가 결국 4번 경로와 겹치지 때문이다.

 

다음으로 고려해야 할 것은 마지막 열의 스티커는 무조건 선택된다는 것이다.

 

이 조건들을 종합적으로 생각해보았을 때 결국 마지막에 어떤 스티커가 골라졌을 때 제일 클지를 비교해봐야한다.

 

점화식)

dp[row][col]      = dp[row+1][col-1]+price[row][col],  dp[row+1][col-2]+price[row][col]  // 대각선 아래 1칸과 대각선 아래 2칸을 비교한다.

dp[row+1][col]  = dp[row][col-1]+price[row][col],  dp[row][col-2]+price[row][col]  // 대각선 위 1칸과 대각선 위 2칸을 비교한다.

 

마지막 열에서 나온 dp  값이 큰 것을 값으로 출력하면 된다 !

코드


import java.util.Scanner;

import static java.lang.Math.max;


public class Main {

    static int[][] dp;
    static int[][] price;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int cnt = sc.nextInt();
        int num=0;
        for (int i = 0; i < cnt; i++) {
            num = sc.nextInt();
            dp = new int[2][num + 1];
            price = new int[2][num + 1];

            for (int j = 0; j < 2; j++) {
                for (int k = 1; k <= num; k++) {
                    price[j][k] = Integer.parseInt(sc.next());
                }

            }
            dp[0][1] = price[0][1];
            dp[1][1] = price[1][1];
            dp(num);
            System.out.println(max(dp[0][num],dp[1][num]));
        }



    }

    static void dp(int num) {

        for (int i = 2; i <= num; i++) {
            dp[0][i] = max(dp[1][i-1] + price[0][i],dp[1][i-2] + price[0][i]);
            dp[1][i] = max(dp[0][i-1] + price[1][i],dp[0][i-2] + price[1][i]);
        }
    }

}

'알고리즘' 카테고리의 다른 글

백준 3085번) 사탕 게임 java  (0) 2023.03.09
백준 2156번) 포도주 시식 java  (0) 2023.03.01
백준 1309) 동물원 java  (0) 2023.02.25
백준 1149번) RGB거리 java  (0) 2023.02.24
백준 2225번) 합분해 java  (0) 2023.02.22