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

 

1149번: RGB거리

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

www.acmicpc.net

 

 

 문제 설명 

 

집의 갯수가 주어지고 각집마다 빨강,초록,파랑 으로 색칠할때 드는 비용이 주어진다

각집은 옆집과 똑같은 색으로 칠할 수 없다 이때 모든집을 칠할수 있는 총 비용의 최소값 출력 .

 

 알고리즘 

 

DP배열을 2차원으로 설정한다 .

DP[집순서][색] // 0:빨강 1:초록 2:파랑

각집을 빨,초,파 로색칠했을 때의 최소비용을 점화식을 이용하여 업데이트 시켜주면 된다.

 

점화식 : DP[i][0]=MIN(DP[i-1][1],DP[i-1][2])

           DP[i][1]=MIN(DP[i-1][0],DP[i-1][2])

           DP[i][2]=MIN(DP[i-1][0],DP[i-1][1])

 

코드 

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
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
 
 
int main() {
    int N;
    cin >> N;
    int dp[1003][3];
 
 
    int arr[1005][3];
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < 3; j++) {
            cin >> arr[i][j];
        }
    }
    dp[0][0= arr[0][0];   //첫번째 집을 R로 색칠
    dp[0][1= arr[0][1];   //첫번째 집을 G로 색칠
    dp[0][2= arr[0][2];   //첫번째 집을 B로 색칠
 
    for (int i = 1; i < N; i++) {
        dp[i][0= min(dp[i - 1][1], dp[i - 1][2]) + arr[i][0];   //i번째 집을 R로 색칠 
        dp[i][1= min(dp[i - 1][0], dp[i - 1][2]) + arr[i][1];   //i번째 집을 G로 색칠 
        dp[i][2= min(dp[i - 1][0], dp[i - 1][1]) + arr[i][2];   //i번째 집을 B로 색칠 
    }
    cout << min(min(dp[N - 1][0], dp[N - 1][1]), dp[N - 1][2]);
 
 
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

 

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

백준 1003번 : 피보나치 함수  (0) 2020.04.06
백준 2573번: 빙산  (0) 2020.04.06
백준 9095번 : 1,2,3 더하기  (0) 2020.04.06
백준 11055: 가장 큰 증가 부분 수열  (0) 2020.04.03
백준 12865: 평범한 배낭  (0) 2020.04.03
ariz1623