본문 바로가기

백준/백준

[ 백준 9465 ] 스티커

1. 문제 링크 https://www.acmicpc.net/problem/9465

 

9465번: 스티커

문제 상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다. 상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다. 모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점

www.acmicpc.net

2. 문제

3. 문제 요약

이차원 배열로부터 주어진 조건을 만족하는 최대값을 찾는 문제.

 

4. 문제 풀이

전형적인 DP 문제이다.

현재 상태에서 최대값을 얻기 위해서 고려해야할 이전 상태들을 파악하고,

현재 상태를 만들 수 있는 값들을 비교하여 비교 값의 최대값을 이용하여 탐색한다.

 

문제의 크기를 작게 축소해서 2x3 을 만들어보면, 경우의 수를 쉽게 구할 수 있다.

현재 상태(i)에서의 최대값을 구하는데 필요한 것이 직전의 두개 상태 (i-1), (i-2)만 고려하면 된다.

 

참고하는데 필요한 상태는 3개인데, 주어진 입력 조건에서 n>1 이므로,

예외를 만들고 싶지 않아서 DP 배열의 크기는 n+2로 설정해두고 계산했다.


5. 풀이 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
public static int problem9465() throws Exception {
    str1 = new StringTokenizer(bfr.readLine());
    int n = Integer.parseInt(str1.nextToken());
    int[][] dp = new int[n + 2][2];
 
    str1 = new StringTokenizer(bfr.readLine());
    str2 = new StringTokenizer(bfr.readLine());
    for (int i = 2; i < n + 2; i++) {
        dp[i][0= Integer.parseInt(str1.nextToken()) + Math.max(dp[i - 1][1], dp[i - 2][1]);
        dp[i][1= Integer.parseInt(str2.nextToken()) + Math.max(dp[i - 1][0], dp[i - 2][0]);
    }
    return Math.max(dp[n + 1][0], dp[n + 1][1]);
}
Colored by Color Scripter
 

 

'백준 > 백준' 카테고리의 다른 글

[ 백준 4963 ] 섬의 개수  (0) 2019.11.04
[ 백준 1978 ] 소수 찾기  (0) 2019.11.03
[ 백준 1002 ] 터렛  (0) 2019.11.01
[백준 1780] 종이의 개수  (0) 2019.02.09
[백준 1992] 쿼드트리  (0) 2019.02.08