오뚝이개발자

[백준9465] 스티커 본문

코딩 테스트/백준

[백준9465] 스티커

땅어 2020. 4. 23. 00:49
728x90
300x250

문제


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

 

9465번: 스티커

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

www.acmicpc.net

 

생각의 흐름


동적프로그래밍의 핵심 1) 전체 과정 중 반복되는 작은 단계 찾기 2) 해당 단계에서의 최대 혹은 최소값 찾기 3) 갱신시켜가며 다음 단계에서의 최대 혹은 최소값 찾기 만 잘 기억하면 된다.

주어진 input이 위 문제 링크의 첫 번째 케이스라고 한다면 각 칸에 올 수 있는 최대수는 아래와 같다.

 

50 10+30=40

100+

max(100, 30)=200

20+

max(120, 100)=140

40+

max(210, 120)=250

30 50+50=100

70+

max(40, 50)=120

10+

max(200, 40)=210

60+

max(140, 200)=260

 

2열의 경우 단순히 왼쪽 대각선에 있는 수를 더해준 수가 오는 것이 최대이다. 하지만 3열부터는, 왼쪽 대각선 방향의 수와 그 수의 왼쪽에 있는 수 중에 max를 더해주는 것이 최대이다.

 

코드


# 백준9465
T = int(input())
for _ in range(T):
    n = int(input())
    sticker = []
    for i in range(2):
        sticker.append(list(map(int, input().split())))
    sticker[0][1] += sticker[1][0]
    sticker[1][1] += sticker[0][0]
    for i in range(2, n):
        sticker[0][i] += max(sticker[1][i-1], sticker[1][i-2])
        sticker[1][i] += max(sticker[0][i-1], sticker[0][i-2])
    print(max(sticker[0][n-1], sticker[1][n-1]))

 

728x90
300x250
Comments