Algorithm/Baekjoon Online Judge

[다이나믹 프로그래밍] BOJ_1149 RGB거리

best 2017. 2. 14. 18:14

문제

RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이다. 처음 집과 마지막 집은 이웃이 아니다.

각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠할 때 드는 비용의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 집의 수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 각 집을 빨강으로 칠할 때, 초록으로 칠할 때, 파랑으로 칠할 때 드는 비용이 주어진다.

출력

첫째 줄에 모든 집을 칠할 때 드는 비용의 최솟값을 출력한다.

예제 입력 

3
26 40 83
49 60 57
13 89 99

예제 출력 

96


------

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package dp;
import java.util.Scanner;
 
public class baekjoon_1149 {
    
    public static void main(String args[]) throws Exception {
        
        Scanner sc = new Scanner(System.in);
        
        int N = sc.nextInt();
        int arr[][] = new int[3][N];
        int r, g, b;
        
        arr[0][0= sc.nextInt();
        arr[1][0= sc.nextInt();
        arr[2][0= sc.nextInt();
        
        
        for(int i = 1; i < N; i++ ){
            r = sc.nextInt();
            g = sc.nextInt();
            b = sc.nextInt();
 
            arr[0][i] = Math.min(arr[1][i-1], arr[2][i-1]) + r; 
            arr[1][i] = Math.min(arr[0][i-1], arr[2][i-1]) + g; 
            arr[2][i] = Math.min(arr[0][i-1], arr[1][i-1]) + b; 
        }
        System.out.println(Math.min(arr[0][N-1], Math.min(arr[1][N-1], arr[2][N-1])));
    }
 
}
 
 
cs