300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 |
Tags
- 코딩 테스트
- 네트워크
- dp
- 브루트포스
- 그래프
- DFS
- 동적 프로그래밍
- 구글 킥스타트
- 딥러닝
- 프로그래머스
- CSS
- BFS
- nlp
- google coding competition
- 킥스타트
- kick start
- 프로그래밍
- 코딩
- 백준
- 파이썬
- 순열
- 운영체제
- OS
- AI
- linux
- 알고리즘
- 리눅스
- 코딩테스트
- PYTHON
- 동적프로그래밍
Archives
- Today
- Total
오뚝이개발자
[백준9465] 스티커 본문
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
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준11055] 가장 큰 증가하는 부분수열 (0) | 2020.04.28 |
---|---|
[백준11057] 오르막수 (0) | 2020.04.26 |
[백준11727] 2 x n 타일링 2 (0) | 2020.04.21 |
[백준11722] 가장 긴 감소하는 수열 (0) | 2020.04.20 |
[백준11052] 카드 구매하기 (0) | 2020.04.17 |
Comments