문제링크 : https://www.acmicpc.net/problem/1149


해결방법 :


RGB 거리의 모든 집들을 R,G,B 색으로 칠했을때 드는 최소비용을 구하는 문제인데, 나는 제일 마지막집을 때내어 생각했다. 


제일 마지막 집이 빨간색으로 칠해질 때 이웃한 집은 G, B 두가지중 하나로만 색칠해야된다.

마찬가지로 그린 이라면 이웃한 집은 R,B 두가지 중 하나로 칠해져야한다.

즉, 하나의 색깔이 정해지면 이웃한집은 그에 따라 두가지의 경우로 나눠진다.


위의 컨셉을 이용해서 점화식을 세워보면 다음과 같이 만들 수 있다.

D[N][0] = N번째 집이 빨간색으로 칠할 때,  모든 집의 최소비용 으로 정의한다. (0 : 레드, 1 : 그린, 2: 블루)

그러면 D[N][0] = min(D[N-1][1], D[N-1][2]) + rgb[N][0]  의 점화식을 세울 수 있다.


마지막집이 r,g,b 세가지의 경우를 가지기 때문에 D[N][0], D[N][1], D[N][2] 를 각각 구해서 최소값을 찾으면 답을 구할 수 있다.




소스코드)


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
#include<stdio.h>
int rgb[1001][3];
int Min = 987654321;
int d[1001][3];
int min(int x, int y){return x<y ? x : y;}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i = 1; i<=n; i++)
    {
        for(int j = 0; j<3; j++)
        scanf("%d"&rgb[i][j]);
    }
    d[1][0= rgb[1][0];
    d[1][1= rgb[1][1];
    d[1][2= rgb[1][2];
    for(int i= 2; i<=n; i++)
    {
        d[i][0= min(d[i-1][1],d[i-1][2]) + rgb[i][0];
        d[i][1= min(d[i-1][0],d[i-1][2]) + rgb[i][1];
        d[i][2= min(d[i-1][0],d[i-1][1]) + rgb[i][2];
    }
    for(int i = 0; i<3; i++)
    {
        if(d[n][i] < Min)
        {
            Min = d[n][i];
        }
    }
    printf("%d",Min);
}
cs


반응형

'PS > 백준' 카테고리의 다른 글

1699 제곱수의 합  (0) 2019.05.26
1932번 정수삼각형  (0) 2018.12.30
7490번 0 만들기  (0) 2018.12.05
1003번 피보나치 함수  (0) 2018.12.02
1065번 한수  (0) 2018.11.16

+ Recent posts