[Baekjoon,17404] RGB거리 2

최대 1 분 소요

원형으로 되어있는 구조에서 집들의 색상을 어떻게 최소 비용으로 조합할지 찾아야 한다. 원형으로 되어있다는 것은 첫 번째 집과 마지막 집이 이어져 있다는 것이다. 이 때문에 첫 번째 집의 색상이 마지막 집의 색상에 영향을 준다. 따라서 첫 번째 색상이 어떻게 되어있냐에 따라 나머지 집의 색상을 선택하면 된다. 부분 문제를 다음과 같이 정의할 수 있다.

  • $dp(here,prevColor,firstColor)=$현재 $here$번째 집이고 바로 앞의 집의 색이 $prevColor$이며, 첫 번째 집의 색상이 $firstColor$일때 나머지 집을 칠하는 최소 비용

이에 대한 구현은 아래에서 볼 수 있다. 첫 번째 집의 색을 먼저 고르고 $dp()$ 함수를 호출하고 있다.

#include <iostream>
#include <cstring>
using namespace std;

const int INF=987654321;
const int MAX_N=1000;

int N;
int cost[MAX_N][3];
int cache[MAX_N][3][3];

int dp(int here, int prevColor, int firstColor)
{
    // 색상 선택이 완료된 경우 
    if(here==N)
        return 0;
    
    int& ret=cache[here][prevColor][firstColor];
    if(ret!=-1)
        return ret;
    
    ret=INF;
    for(int color=0;color<3;++color)
        if(color!=prevColor)
        {
            // 현재 선택할 색상의 집이 마지막 집인데 
            // 첫 번째 집과 색이 같은 경우 
            if(here==N-1 && firstColor==color)
                continue;
            ret=min(ret,dp(here+1,color,firstColor)+cost[here][color]);
        }
    
    return ret;
}

int main()
{
    cin>>N;
    for(int i=0;i<N;++i)
        cin>>cost[i][0]>>cost[i][1]>>cost[i][2];
    memset(cache,-1,sizeof(cache));
    
    int ret=INF;
    // 첫 번째 집의 색을 먼저 고른다. 
    for(int color=0;color<3;++color)
        ret=min(ret,dp(1,color,color)+cost[0][color]);
    
    cout<<ret<<endl;
    return 0;
}

댓글남기기