본문 바로가기
Algorithm/동적계획법(DP)

1149 RGB거리

by neohtux 2020. 1. 22.
728x90

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

 

1149번: RGB거리

RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이고, 첫 집과 마지막 집은 이웃이 아니다. 각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠하는 비용의 최솟값을 구하는 프로그램을 작성하시오.

www.acmicpc.net

RGB거리 실패

시간 제한메모리 제한제출정답맞은 사람정답 비율

0.5 초 (추가 시간 없음) 128 MB 38775 17920 13458 47.319%

문제

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

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

입력

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

출력

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

예제 입력 1 복사

3 26 40 83 49 60 57 13 89 99

예제 출력 1 복사

96

출처

  • 문제를 번역한 사람: baekjoon
  • 빠진 조건을 찾은 사람: djm03178
  • 데이터를 추가한 사람: rdd6584

 

<실패 풀이>

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h>
#include<algorithm>
 
enum Color{R=0,G,B};
using namespace std;
int main(void)
{
    int get_cost[1001][B+1];
 
    int house_count;
    scanf("%d"&house_count);
    
    for (unsigned short i = 0; i < house_count; ++i)
    {
        for (unsigned short k = 0; k < B + 1++k)
        {
            scanf("%d"&get_cost[i][k]);
        }
    }
    // get_cost -> 입력 R,G,B 값
    // result_sum -> 최소비용 축적되는 값들. { R0[0] G0[1] B0[2]}
                                           //  R1[0] G1[1] B1[2]}
                                           //  R2[0] G2[1] B2[2]}
    //
    int temp = 0;
    int stack = 0;
    temp = min({ get_cost[0][R], get_cost[0][G], get_cost[0][B] });
    stack = temp;
    for (unsigned short i = 0; i < house_count-1++i)
    {
        if (temp == get_cost[i][R])
        {
            temp = min(get_cost[i + 1][G], get_cost[i + 1][B]);
            stack += temp;
        }
        else if (temp == get_cost[i][G])
        {
            temp = min(get_cost[i + 1][R], get_cost[i + 1][B]);
            stack += temp;
        }
        else if (temp == get_cost[i][B])
        {
            temp = min(get_cost[i + 1][R], get_cost[i + 1][G]);
            stack += temp;
        }
    }
 
 
    //
    printf("%d\n"stack);
    return 0;
}
 
cs

 

<신규 풀이>

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
34
#include<stdio.h>
#include<algorithm>
 
enum Color{R=0,G,B};
using namespace std;
int get_cost[1001][3];
int d[1001][3];
int main(void)
{
 
    int house_count;
    scanf("%d"&house_count);
    
    for (unsigned short i = 1; i <= house_count; ++i)
    {
        for (unsigned short k = 0; k < 3++k)
        {
            scanf("%d"&get_cost[i][k]);
        }
    }
    
    for (int i = 1; i <= house_count; i++)
    {
        d[i][R] = min(d[i - 1][G], d[i - 1][B]) + get_cost[i][R];
        d[i][G] = min(d[i - 1][R], d[i - 1][B]) + get_cost[i][G];
        d[i][B] = min(d[i - 1][R], d[i - 1][G]) + get_cost[i][B];
    }
 
    //
    printf("%d\n", min({ d[house_count][R], 
                         d[house_count][G], 
                         d[house_count][B] }));
    return 0;
}
 
cs
300x250

'Algorithm > 동적계획법(DP)' 카테고리의 다른 글

10844 쉬운 계단수  (0) 2020.03.17
11727 2 x n 타일링 2  (0) 2020.03.17
2579 계단 오르기  (0) 2020.01.22
9095 1,2,3 더하기  (0) 2020.01.20
11726 2xn타일링  (0) 2020.01.20

댓글