RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
import sys
input = sys.stdin.readline
n = int(input())
cost = [list(map(int, input().split())) for _ in range(n)]
dp = [[0]*3 for _ in range(n+1)] # 0 = R / 1 = G / 2 = B
dp[0][0] = cost[0][0]
dp[0][1] = cost[0][1]
dp[0][2] = cost[0][2]
for i in range(1, n):
dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + cost[i][0]
dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + cost[i][1]
dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + cost[i][2]
print(min(dp[n-1]))
규칙이 어려워보이지만, 사실상 바로 이웃한 집과 색깔이 겹치지만 않으면 되는 것이다. 쉬운 계단 수 문제처럼 2차원 배열을 사용하면 되는데, dp[i][j]
를 "i번째 집을 j색으로 칠했을 때 최소 비용" 이라고 정의하면 된다. 이 때 j = 0
→ R, j = 1
→ G, j = 2
→ B로 두고, i번째 집을 빨간색으로 칠했을 때 최소 비용은 그 i-1번째 집을 초록색, 파란색 중에 더 적은 비용이 드는 색으로 골랐을 때의 비용 + i번째 집을 빨간색으로 칠했을 때의 비용이므로 점화식을 이에 맞게 세우고, 맨 마지막 집에서 최소 비용을 고르면 된다.