BOJ#1149 RGB거리
* 문제
https://www.acmicpc.net/problem/1149
* 풀이
▷ 규칙
- 각 집은 R, G, B 3가지 색 중 한가지 색으로 칠한다.
- 이웃한 집은 같은 색으로 칠하지 않는다.
- 마지막 집은 R, G, B 3가지 색 중 하나이다.
- 위 3가지 경우 중 최소값이 우리가 원하는 정답이다.
▷ dp 정의
dp[i][RED] : 0~i 번째 집까지 색칠했을 때 + i번째 집이 RED일 때 cost
dp[i][GREEN] : 0~i 번째 집까지 색칠했을 때 + i번째 집이 GREEN일 때 cost
dp[i][BLUE] : 0~i 번째 집까지 색칠했을 때 + i번째 집이 BLUE일 때 cost
▷ 점화식
dp[i][RED] = min(dp[i-1][GREEN], dp[i-1][BLUE]) + RGB[i][RED]
dp[i][GREEN] = min(dp[i-1][RED], dp[i-1][BLUE]) + RGB[i][GREEN]
dp[i][BLUE] = min(dp[i-1][RED], dp[i-1][GREEN]) + RGB[i][BLUE]
* 나의 코드
https://github.com/stack07142/BOJ/tree/master/BOJ%231149_RGBStreet/src
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
* BOJ#1149 RGB 거리
* https://www.acmicpc.net/problem/1149
*/
public class Main {
static final int RED = 0;
static final int GREEN = 1;
static final int BLUE = 2;
public static void main(String[] args) throws IOException {
int N;
int[][] RGB;
int[][] dp; // dp[i][j] : i번째 집을 j색으로 색칠했을 때 최소 비용
// input
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
RGB = new int[N][3];
dp = new int[N][3];
for (int i = 0; i < 3; i++) {
Arrays.fill(dp[i], 0);
}
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int j = 0; j < 3; j++) {
RGB[i][j] = Integer.parseInt(st.nextToken());
}
}
// solve
dp[0][RED] = RGB[0][RED];
dp[0][GREEN] = RGB[0][GREEN];
dp[0][BLUE] = RGB[0][BLUE];
for (int i = 1; i < N; i++) {
for (int j = 0; j < 3; j++) {
dp[i][j] = getMin(dp, i - 1, j) + RGB[i][j];
}
}
System.out.println(Math.min(dp[N - 1][RED], Math.min(dp[N - 1][GREEN], dp[N - 1][BLUE])));
} // main
static int getMin(int[][] dp, int house, int exclude) {
return exclude == RED ? Math.min(dp[house][GREEN], dp[house][BLUE]) : exclude == BLUE ? Math.min(dp[house][RED], dp[house][GREEN]) : Math.min(dp[house][RED], dp[house][BLUE]);
}
}
'Algorithm > DP' 카테고리의 다른 글
BOJ#2565 전깃줄 (0) | 2017.02.20 |
---|---|
BOJ#1932 숫자삼각형 (0) | 2017.02.09 |
BOJ#9251 LCS (0) | 2017.02.06 |
BOJ#2293 동전1 (0) | 2017.01.24 |
BOJ#11066 파일 합치기 (Merging Files) (3) | 2016.12.23 |