난이도
실버 1
문제
https://www.acmicpc.net/problem/1149
풀이
테이블 정의하기
dp[i] = i번째 집일 때 집을 칠하는 최소 비용
점화식 찾기
i번째 집이 빨강일 때(0),
i-1번째 집이 초록집이거나 파랑인 경우에 최솟값과 빨강일 때의 값을 더해줍니다.
i번째 집이 초록일 때(1), i번째 집이 파랑일 때(2)도 위와 같은 방식으로 식을 채워줍니다.
dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + r;
dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + g;
dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + b;
초기값 정의하기
없음
출력은 dp[n][0], dp[n][1], dp[n][2] 중 최솟값을 출력합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// 1149번 RGB 거리
public class RGB거리 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int[][] dp = new int[n + 1][3];
for (int i = 1; i <= n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int g = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
dp[i][0] = Math.min(dp[i - 1][1], dp[i - 1][2]) + r;
dp[i][1] = Math.min(dp[i - 1][0], dp[i - 1][2]) + g;
dp[i][2] = Math.min(dp[i - 1][0], dp[i - 1][1]) + b;
}
System.out.println(Math.min(dp[n][0], Math.min(dp[n][1], dp[n][2])));
}
}