티스토리 뷰
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
- Dijkstra
- dfs
- graph
- 조합
- Brute Force
- two pointer
- 자료구조
- db
- Stack
- C++
- back tracking
- C
- 이분탐색
- floyd warshall
- Tree
- Python
- MVC
- recursion
- Unity
- DP
- Kruskal
- Implementation
- priority queue
- binary search
- CSS
- 재귀
- greedy
- permutation
- BFS
- Spring
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
