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 | 31 |
Tags
- linux
- DFS
- 리눅스
- 킥스타트
- 딥러닝
- BFS
- 코딩
- OS
- 동적 프로그래밍
- 알고리즘
- nlp
- dp
- 백준
- 운영체제
- 코딩테스트
- google coding competition
- AI
- 네트워크
- 순열
- 프로그래밍
- 그래프
- 브루트포스
- CSS
- 코딩 테스트
- 프로그래머스
- PYTHON
- 파이썬
- 구글 킥스타트
- 동적프로그래밍
- kick start
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