https://www.acmicpc.net/problem/1149
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
'''
인접한 집들의 색이 같지 않아야 함
R,G,B 세 가지 색으로 칠함
i번째 집을 칠하는 비용은 i-1번째 집에 따라 달라짐
dp[i][color]를 i번째 집까지 칠하는 데 드는 최소 비용으로 설정
'''
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)]
dp[0] = cost[0] # 첫 번째 집을 칠하는 비용은 그대로(시작이니까)
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]))
'''
이렇게 dp를 따로 안만들고 갱신해나가는 방법도 있음! 메모리 차이는 없고 시간 차이 조금 남!
import sys
input = sys.stdin.readline
N = int(input())
cost = [list(map(int, input().split())) for _ in range(N)]
for i in range(1,n):
cost[i][0]= min(cost[i-1][1],cost[i-1][2]) + cost[i][0]
cost[i][1]= min(cost[i-1][0],cost[i-1][2]) + cost[i][1]
cost[i][2]= min(cost[i-1][0],cost[i-1][1]) + cost[i][2]
print(min(cost[n-1][0],cost[n-1][1],cost[n-1][2]))
'''
+ 24.10.24
n = int(input())
# 인접한 하나 or 두개의 집과 색이 같으면 안됨!
graph = [list(map(int,input().split())) for _ in range(n)]
dp = [[0 for _ in range(3)] for _ in range(n)]
for k in range(3): # 초기값 세팅
dp[0][k] = graph[0][k]
# 1번째 집부터 n-1번째 집까지의 최소 비용을 구함
for i in range(1, n):
dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + graph[i][0] # R을 선택한 경우
dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + graph[i][1] # G를 선택한 경우
dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + graph[i][2] # B를 선택한 경우
print(min(dp[-1]))
'백준' 카테고리의 다른 글
백준 12852. 1로 만들기2 (0) | 2024.03.10 |
---|---|
백준 11726. 2xn 타일링 (0) | 2024.03.10 |
백준 2579. 계단 오르기 (0) | 2024.03.10 |
백준 9095. 1, 2, 3 더하기 (0) | 2024.03.09 |
백준 10844. 쉬운 계단 수 (0) | 2024.03.08 |