Algorithm_BOJ(백준)/동적프로그래밍(DP)

[백준 1149 c++ VO] RGB거리

xhaktmchl 2021. 7. 19. 12:38
728x90
반응형

 

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
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// [백준 1149 c++ VO] RGB거리
// 문제: 각 집마다 서로다른 규칙을 따른 색의 비용의 최소값을 구하는 문제
// 접근: 탑다운 dp -> n번째 집이 r일때 n-1집은g,b중하나 g일때 n-1집은 r,b중 하나, b일때 n-1집은 r,g중 하나
// 점화식 : dp[j][1] = min(dp[j - 1][2], dp[j - 1][3])+r; // j번째 집이 빨
//dp[j][2] = min(dp[j - 1][1], dp[j - 1][3]) + g;// j번째 집이 초
//dp[j][3] = min(dp[j - 1][1], dp[j - 1][2]) + b;// j번째 집이 파
// 풀이: 첫번째 집 비용 입력
// 반복문으로 다음 집부터 빨간색이면 전의 집은 초,파 중 최소비용인 경우의 합 저장
// 처음 집의 색이 빨초파 인 3가지 경우중 최소비용 출력
#define MAX 1001
int n;
long long dp[MAX][4];
long long answer = 0;
int main()
{    
    ios::sync_with_stdio(false); // 계산시간 단축 // 문제마다 오류 유무 다름
    cin.tie(NULL); cout.tie(NULL);// 입출력 시간 단축
                                  
    cin >> n;
    int r, g, b;
    cin >> r >> g >> b;
 
    // dp점화식
    // 점화식 : dp[j][1] = min(dp[j - 1][2], dp[j - 1][3])+r; // j번째 집이 빨
    //dp[j][2] = min(dp[j - 1][1], dp[j - 1][3]) + g;// j번째 집이 초
    //dp[j][3] = min(dp[j - 1][1], dp[j - 1][2]) + b;// j번째 집이 파
    dp[1][1= r; dp[1][2= g; dp[1][3= b;
    for (int j = 2; j <= n; j++) {
        cin >> r >> g >> b; // j번째 집의 r,g,b비용
        dp[j][1= min(dp[j - 1][2], dp[j - 1][3])+r; // j번째 집이 빨
        dp[j][2= min(dp[j - 1][1], dp[j - 1][3])+g;// j번째 집이 초
        dp[j][3= min(dp[j - 1][1], dp[j - 1][2])+b;// j번째 집이 파
    }
    // r,g,b로 끝나는 것중 최소비용 저장
    long long min_cost = 1000001;
    min_cost = min(min(dp[n][1], dp[n][2]), dp[n][3]);
    
    // 결과값 출력
    cout << min_cost;
 
    return 0;
}
cs
반응형