반응형

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

 

17404번: RGB거리 2

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

www.acmicpc.net

 

 

[ 문제풀이 ]

 

https://rudalsd.tistory.com/12

 

[ 백준 ] 1149번 - RGB거리 (C++)

https://www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주..

rudalsd.tistory.com

위 글을 먼저 보고 오는 것을 추천드립니다!!

 

일반 RGB거리와 다른 점은 1번 집과 N번 집도 색깔이 같으면 안 된다는 조건입니다.

 

따라서 일반적인 RGB거리의 답을 구하는 방식으로 구하되 마지막에 1번 집과 N번 집이 같지 않을 때의 최솟값을 구하면 되는 문제입니다.

 

[ 소스 코드 ]

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
#define MAX 987654321
 
#include <iostream>
 
using namespace std;
 
int N;
 
int arr[3][1001];        //각 색의 가격을 저장할 배열
int dp[3][1001];        //각 색을 칠했을 때의 총 가격
 
int main()
{
    cin >> N;
    int ans = MAX;
    for (int i = 1; i <= N; i++) {
        cin >> arr[0][i] >> arr[1][i] >> arr[2][i];
    }
 
    for (int i = 0; i < 3; i++)    //첫 집의 색깔을 졍해주기
    {
        for (int j = 0; j < 3; j++) {
            if (i == j) dp[j][1= arr[j][1];    //첫 집의 색만 가격 입력
            else dp[j][1= MAX;                //나머지 색은 가격 MAX
        }                                        //다음 집에서 첫 집의 색을 고르지 못하도록 하기 위해서
 
        for (int j = 2; j <= N; j++) {
            dp[0][j] = min(dp[1][j - 1], dp[2][j - 1]) + arr[0][j];    //앞의 집의 색 중 가격이 싼 색의 값과 지금 집 색의 값을 더함
            dp[1][j] = min(dp[0][j - 1], dp[2][j - 1]) + arr[1][j];
            dp[2][j] = min(dp[0][j - 1], dp[1][j - 1]) + arr[2][j];
        }
 
        for (int j = 0; j < 3; j++) {
            if (i != j) {                //마지막 집이 첫 집과 색이 같으면 안되기 때문에 i!=j 조건 넣기
                ans = min(ans, dp[j][N]);
            }
        }
    }
 
    cout << ans;
}
cs
반응형

+ Recent posts