티스토리 뷰

PS

9465. 스티커

tose33 2020. 8. 10. 18:32

 

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

 

9465번: 스티커

문제 상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다. 상냥이가 구매한 스티

www.acmicpc.net

스티커를 때어내면, 그 스티커와 변을 공유하는 스티커들도 때어진다.

즉 때어낸 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커들은 사용할 수 없다.

이때 때어낼 수 있는 스티커 점수의 최대값을 구하는 문제.

 

일단 d[n]을 d[n] : 길이가 n인 스티커에서의 점수의 최댓값이라고 하자.

 

전의 포도주 문제와 비슷하게 n번째 열 일 때의 상태는 다음과 같이 있을 수 있다

0: 둘 다 떼어내지 않음

1 :위만 떼어냄

2 :아래만 떼어냄

(위 아래 둘 다 떼어내는 경우는 없다, 왜냐하면 스티커 하나를 떼어내면 인접 스티커도 떼어지기 때문)

 

n열이 0상태 일 때는(둘 다 떼어내지 않음),

n-1열은 0상태, 1상태, 2상태 모두 올 수 있다.

d[n][0] = max(d[n-1][0], d[n-1][1], d[n-1][2])

 

n열이 1상태 일 때는(위만 떼어냄),

n-1열이 0상태 또는 2상태가 있을수 있다.

d[n][1] = max(d[n-1][0], d[n-1][2]) + a[0][i-1]  // a[0][i-1]은 떼어낸 위 스티커

 

n열이 2상태 일 때는(아래만 떼어냄),

n-1열이 0상태 또는 1상태가 있을 수 있다.

d[n][2] = max(d[n-1][0], d[n-1][1]) + a[1][i-1]  // a[1][i-1]은 떼어낸 아래 스티커

 

 

d = [[0] * 3 for i in range(100002)]
a = [[0] * 100001 for i in range(2)]

t = int(input())
for x in range(t):
    n = int(input())
    a[0] = input().split()
    a[1] = input().split()

    for i in range(n):  # int형 변환
        a[0][i] = int(a[0][i])
        a[1][i] = int(a[1][i])

    d[0][0] = d[0][1] = d[0][2] = 0  # base

    for i in range(1, n+1):
        d[i][0] = max(d[i-1][0], d[i-1][1], d[i-1][2])  # 안 뗴어냄
        d[i][1] = max(d[i-1][0], d[i-1][2]) + a[0][i-1]  # 위 떼어냄
        d[i][2] = max(d[i-1][0], d[i-1][1]) + a[1][i-1]  # 아래 떼어냄

    for i in range(1, n+1):
        print(d[i][0], d[i][1], d[i][2])

 

'PS' 카테고리의 다른 글

11722. 가장 긴 감소하는 부분수열  (0) 2020.08.10
11053. 가장 긴 증가하는 부분수열  (0) 2020.08.10
2156. 포도주 시식  (0) 2020.08.10
11057. 오르막 수  (0) 2020.08.07
10844. 쉬운 계단 수  (0) 2020.08.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함