[DP]백준1149번 RGB거리

업데이트:

백준1149 RGB거리

_2021-03-06__1 08 16

아직 DP가 익숙하지 않아 많이 헷갈렸다.

다만 DP 문제를 풀 때, 한 가지 잘 생각해야 하는 점은

DP는 어떤 하나의 케이스를 고르는 것이 아니라, 모든 케이스를 저장하며 가는 것이다.”

이 문제의 경우는, 각 집 별로 세 가지의 경우가 있다.

집을 빨간색, 초록색, 파란색으로 칠하는 경우이다.

따라서 각 집 별로 모든 경우의 수를 계산하면서 가면 된다.

이 때, 헷갈리는 조건은

  • i(2 ≤ i ≤ N-1) 번 집의 색은 i-1번, i+1 번 집의 색과 같지 않아야 한다.

는 것이었는데, i-1과 i+1의 색이 달라야 한다는 말은 없다.

따라서 우리는 dp의 점화식을 구성할 때 당장 직전에 고른 것만 피해가면 되는 것이다.

dp 배열 : 집을 각 색깔 별로 칠하는데 드는 비용

초기값:

첫 번째 집의 정답 배열[빨강] = 첫 번째 집을 칠하는 비용[빨강]

첫 번째 집의 정답 배열[초록] = 첫 번째 집을 칠하는 비용[초록]

첫 번째 집의 정답 배열[파랑] = 첫 번째 집을 칠하는 비용[파랑]

점화식

//현재 보고 있는 집 i

i 번째 집을 빨간색으로 칠하는데 드는  비용 : 
	min(i-1번째 집을 초록색으로 칠하는 경우, i-1번째 집을 파란색으로 칠하는 경우) +
	i 번째 집을 빨간색으로 칠하는데 드는 비용

i 번째 집을 초록색으로 칠하는데 드는  비용 : 
	min(i-1번째 집을 빨간색으로 칠하는 경우, i-1번째 집을 파란색으로 칠하는 경우) +
	i 번째 집을 초록색으로 칠하는데 드는 비용

i 번째 집을 파란색으로 칠하는데 드는  비용 : 
	min(i-1번째 집을 빨간색으로 칠하는 경우, i-1번째 집을 초록색으로 칠하는 경우) +
	i 번째 집을 파란색으로 칠하는데 드는 비용

모든 집을 칠한 다음에는 마지막 집의 dp 배열에서 최솟값을 출력한다.

마지막 집의 dp 배열 :
[0] : 마지막 집을 빨간색으로 칠하는데 드는  비용
[1] : 마지막 집을 초록색으로 칠하는데 드는  비용
[2] : 마지막 집을 파랑색으로 칠하는데 드는  비용

cout << min(dp[마지막][0], dp[마지막][1], dp[마지막][2]);
#include <iostream>
#include <algorithm>
using namespace std;

int houses[1005][3];
int answer[1005][3];
int tmp[2];
int main(){
    int N;
    cin >> N;
    
    for(int i=1;i<=N;i++){
        for(int j=0;j<3;j++){
            cin >> houses[i][j];
        }
    }
    answer[1][0] = houses[1][0];
    answer[1][1] = houses[1][1];
    answer[1][2] = houses[1][2];
    
    for(int i=2;i<=N;i++){
        answer[i][0] = min(answer[i-1][1] , answer[i-1][2]) + houses[i][0];
        answer[i][1] = min(answer[i-1][0] , answer[i-1][2]) + houses[i][1];
        answer[i][2] = min(answer[i-1][0] , answer[i-1][1]) + houses[i][2];
    }
    
    cout << min({answer[N][0], answer[N][1] , answer[N][2]});
    
    
    
}

카테고리:

업데이트:

댓글남기기