PS/BOJ

[백준 BOJ][DP] 1149 RGB거리

Jubil 2018. 7. 28. 17:37
반응형

1149_RGB거리

링크

https://www.acmicpc.net/problem/1149

 

풀이


 

i의 이웃은 집 i-1i+1이고, 이웃은 같은 색으로 칠할 수 없습니다.

 

DP[i][j] (ij색으로 칠했을 때까지의 최소 비용, j = 0 R, 1 G, 2 B)

cost[i][j] (ij색으로 칠할 때의 비용, j = 0 R, 1 G, 2 B) 이라고 정의하겠습니다.

 

그렇다면 DP[i][0]은 이웃은 같은 색을 칠할 수 없다는 조건에 의해,

min(DP[i-1][1], DP[i-1][2]) + cost[i][0]로 정의됩니다. (전에 다른 색 G, B로 칠했을 때까지의 최소 비용 + 현재 R로 칠했을 때의 비용)

 

, 나머지 색들도 생각해보면 다음과 같은 식이 나옵니다.

 

DP[i][0] = min(DP[i-1][1], DP[i-1][2]) + cost[i][0]

DP[i][1] = min(DP[i - 1][0], DP[i - 1][2]) + cost[i][1]

DP[i][2] = min(DP[i - 1][0], DP[i - 1][1]) + cost[i][2];

 

마지막에 DP[n][0], DP[n][1], DP[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

//1149_RGB거리

#include <cstdio>

#include <algorithm>

using namespace std;

 

int DP[1001][3]; //0 R, 1 G, 2 B

                //n번째 집을 m 색깔로 칠했을 때의 min cost

int cost[1001][3];

 

int main() {

    int n;

 

    scanf("%d"&n);

    

    for (int i = 1; i <= n; ++i) scanf("%d %d %d"&cost[i][0], &cost[i][1], &cost[i][2]);

    

    for (int i = 1; i <= n; ++i) {

        DP[i][0= min(DP[i - 1][1], DP[i - 1][2]) + cost[i][0];

        DP[i][1= min(DP[i - 1][0], DP[i - 1][2]) + cost[i][1];

        DP[i][2= min(DP[i - 1][0], DP[i - 1][1]) + cost[i][2];

    }

 

    printf("%d\n", min(min(DP[n][0], DP[n][1]), DP[n][2]));

    

    return 0;

}

Colored by Color Scripter

cs

 



반응형

'PS > BOJ' 카테고리의 다른 글

[백준 BOJ][DP] 2167 2차원 배열의 합  (2) 2018.08.21
[백준 BOJ][DP] 9465 스티커  (0) 2018.08.21
[백준 BOJ][map] 1764 듣보잡  (0) 2018.07.26
[백준 BOJ][queue] 2075 N번째 큰 수  (0) 2018.07.26
[백준 BOJ][stack] 10799 쇠막대기  (0) 2018.07.26