39 lines
1.7 KiB
Python
39 lines
1.7 KiB
Python
# RGB 거리
|
|
|
|
import sys
|
|
|
|
input = sys.stdin.readline
|
|
|
|
def solution():
|
|
n = int(input().rstrip())
|
|
|
|
lst = [list(map(int, input().rstrip().split())) for _ in range(n)]
|
|
|
|
dp = [[float('inf') for _ in range(3)] for _ in range(n)]
|
|
|
|
dp[0] = lst[0]
|
|
|
|
for i in range(1, n):
|
|
for j in range(3):
|
|
dp[i][j] = min([dp[i-1][k]+lst[i][j] for k in range(3) if k != j])
|
|
|
|
print(min([dp[n-1][j] for j in range(3)]))
|
|
|
|
return
|
|
|
|
|
|
solution()
|
|
|
|
"""
|
|
걸린 시간: 20분
|
|
|
|
시간 복잡도: n*3의 dp 테이블을 채워야 하기 때문에 O(n)이다.
|
|
|
|
해설: 트리 형식으로 완전탐색을 해야할 것 같지만, 최선의 플레이만 잘 저장해놓으면 많이 배제시키고 할 수 있다.
|
|
bfs, 완전탐색, 백트래킹 같은 것이 떠오를 때, dp를 생각해보자.
|
|
현재 줄에서 3가지 중 하나를 볼때, 본인을 제외한 2가지 경우에 대해서 최선이 보장되어 있다면 지금 선택하는 색깔에 대해 최선의 과거를 가져온 것이다.
|
|
물론 지금의 선택이 최종 최선을 보장하진 않기 때문에 모든 색깔에 대해 모든 줄에서 최선의 선택을 하고, 마지막에는 그 최선들 중에 최선을 고르면 된다.
|
|
그럼 그리디 아니냐 할 수 있는데, 그리디로 커버할 수 없는 경우까지 커버하는 것이 이 풀이이다.
|
|
그리디는 계속 그 줄에서 최소를 선택하는 것이지만, 현재 보이는 최소만 선택했을 때 바로 다음에 같은 색깔로 굉장히 작은 숫자가 나오면 최선이 아니게 된다.
|
|
따라서 각 줄에서 3가지 중 뭘 선택했을 때 최선인지 모르기 때문에 3가지 색깔에 대해 그 전에 왔던 최선의 길을 계속 보장하는 것이다.
|
|
""" |