https://www.acmicpc.net/problem/1149
[i]
번째 집[i-1]
, [i+1]
번째 집의 색과 달라야 함1
번 ~ n
번 집까지 색을 칠해나갈 때,[i]
번 집은 이전 [i-1]
번 집의 색과 다른 2가지 색 중에서 선택int[][] dp = new int[n + 1][3]
행: 집 번호, 열: [0 ~ 2]
차례로 RGB
dp[i][j]
: [i]
번 집에 [j]
에 해당하는 색을 칠할 때,
[1]
~ [i]
번 집까지의 색칠 최소 비용 합
=> 마지막 집까지 색칠했을 때, 최소 비용 합 = DP 행렬의 마지막 행에서 최소 값
① [i]
번 집을 R 색으로 칠하는 경우의 최소 비용 합
[i-1]
번 집을 G 색칠하는 경우의 최소 비용 합,[i-1]
번 집을 B 색칠하는 경우의 최소 비용 합[i]
번 집을 R 색칠하는 비용=> dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + cost[i][0]
② [i]
번 집을 G 색으로 칠하는 경우의 최소 비용 합
[i-1]
번 집을 R 색칠하는 경우의 최소 비용 합,[i-1]
번 집을 B 색칠하는 경우의 최소 비용 합[i]
번 집을 G 색칠하는 비용=> dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + cost[i][1]
③ [i]
번 집을 B 색으로 칠하는 경우의 최소 비용 합
[i-1]
번 집을 R 색칠하는 경우의 최소 비용 합,[i-1]
번 집을 G 색칠하는 경우의 최소 비용 합[i]
번 집을 B 색칠하는 비용=> dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + cost[i][2]
int[][] dp
int
가능import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int n; // 집 개수
static int[][] cost; // 각 집의 R, G, B 색칠 비용
static int minSum = Integer.MAX_VALUE; // 출력, 최소 비용 합
static int[][] dp; // 각 집의 R, G, B 색칠 비용 최소 합
static void solution() {
for (int i = 1; i <= n; i++) {
for (int j = 0; j < 3; j++) {
// [i]번 집을 R 색으로 칠하는 경우의 최소 비용 합
dp[i][0] = Math.min(dp[i-1][1], dp[i-1][2]) + cost[i][0];
// [i]번 집을 G 색으로 칠하는 경우의 최소 비용 합
dp[i][1] = Math.min(dp[i-1][0], dp[i-1][2]) + cost[i][1];
// [i]번 집을 B 색으로 칠하는 경우의 최소 비용 합
dp[i][2] = Math.min(dp[i-1][0], dp[i-1][1]) + cost[i][2];
}
}
// 마지막 행에서 minSum 찾기
for (int j = 0; j < 3; j++) {
if (minSum > dp[n][j])
minSum = dp[n][j];
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in)
);
StringTokenizer st;
n = Integer.parseInt(br.readLine());
cost = new int[n + 1][3]; // [1][0] ~ [n][2] 사용
dp = new int[n + 1][3]; // [0]행에 패딩
for (int i = 1; i <= n; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < 3; j++)
cost[i][j] = Integer.parseInt(st.nextToken());
}
solution();
System.out.println(minSum);
}
}