본문으로 바로가기

백준 01149 - RGB거리

category BOJ 백준/Dynamic Programming 2020. 10. 23. 00:55

출처 : www.acmicpc.net/problem/1149

 

1149번: RGB거리

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

www.acmicpc.net

고려사항

- 메모제이션을 이용시에 지금 구하려는 곳으로 도달할 수 있는 경우의 수가 2가지임을 파악.

ex) n 번째 집을 1(G) 컬러로 색칠할 시, n-1 번째 집은 0(R) 과 2(B) 컬러임 => 둘중 작은 비용에 현재 비용 더해서 메모.

- n번째 집이 각각 RGB 컬러로 칠해지는 3가지 최소 비용 값이 memo[n-1][] 에 담겨있으니 최소값 구하기!

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

int n;
int rgb[1000][3];
int memo[1000][3];

int dp(int idx, int color){
    int &minV = memo[idx][color];

    if(idx == 0){
        minV = rgb[idx][color];
        return minV;
    }

    if(memo[idx][color] != 0){
        return minV;
    }

    if(color == 0){
        minV = min(dp(idx-1,1), dp(idx-1,2)) + rgb[idx][0];
    }else if(color == 1){
        minV = min(dp(idx-1,0), dp(idx-1,2)) + rgb[idx][1];
    }else{
        minV = min(dp(idx-1,0), dp(idx-1,1)) + rgb[idx][2];
    }

    return minV;
}

int main() {
    int minR, minG, minB, ans;

    cin>>n;
    for(int i=0;i<n;++i){
        cin>>rgb[i][0]>>rgb[i][1]>>rgb[i][2];
    }

    minR = dp(n-1,0);
    minG = dp(n-1,1);
    minB = dp(n-1,2);

    ans = min(minR, minG);
    ans = min(ans, minB);
    cout<<ans;

    return 0;
}

'BOJ 백준 > Dynamic Programming' 카테고리의 다른 글

백준 11053 - 가장 긴 증가하는 부분 수열  (0) 2020.10.23
백준 09251 - LCS  (0) 2020.10.23
백준 01912 - 연속합  (0) 2020.10.23
백준 02579 - 계단 오르기  (0) 2020.10.23
백준 01932 - 정수 삼각형  (0) 2020.10.23