Lewis's Tech Keep

[백준] 스티커 본문

JAVA/알고리즘

[백준] 스티커

Lewis Seo 2021. 3. 8. 01:49

참고 : www.acmicpc.net/problem/9465

 

9465번: 스티커

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

www.acmicpc.net

 

 - dp 문제

 

 - 다른 사람 풀이를 찾아보니 조금 다르게 풀어서 기쁘기도 하고 신기하기도 했다.
  (생각을 잘 넓히는 것이 중요한 거 같다)

 - dp[i][0] : i번째 스티커 비용의 최대값 (단 i번째는 반드시 위를 선택)

 - dp[i][1] : i번째 스티커 비용의 최대값 (단 i번째는 반드시 아래를 선택)

 - dp[i][2] : i번째 스티커 비용의 최대값 (단 i번째는 반드시 아무것도 선택하지 않음)

 

 - 해당 식을 바탕으로 dp를 전개 해 나갔다.

 

 -- (다른분 풀이는 아무것도 선택하지 않는 경우가 없고 -1번째와 -2번째의 최대 값이었다.)

 

더보기
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int[][] arr;
        int[][] dp;
        int t = sc.nextInt();
        for(int i = 0; i< t; i++) {
            int n = sc.nextInt();
            arr = new int[100005][2];
            dp = new int[100005][3];
            for(int j = 0; j< n; j++) {
                arr[j][0] = sc.nextInt();
            }
            for(int j = 0; j< n; j++) {
                arr[j][1] = sc.nextInt();
            }
            dp[0][0] = arr[0][0]; // 위 선택
            dp[0][1] = arr[0][1]; // 아래 선택
            dp[0][2] = 0; // 노 선택
            for(int j = 1; j< n; j++) {
                dp[j][0] = Math.max(dp[j-1][1], dp[j-1][2]) + arr[j][0];
                dp[j][1] = Math.max(dp[j-1][2], dp[j-1][0]) + arr[j][1];
                dp[j][2] = Math.max(dp[j-1][0], dp[j-1][1]);
            }
            System.out.println(Math.max(dp[n -1][0], Math.max(dp[n -1][1], dp[n -1][2])));
        }
    }
}

 

 

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

[백준] 균형잡힌 세상  (0) 2021.03.10
[백준] 동전1  (0) 2021.03.09
[백준] 부분수열의 합  (0) 2021.03.07
[백준] N-Queen  (0) 2021.03.07
[백준] N과 M  (0) 2021.03.07
Comments