Algorithm

[백준] RGB거리 1149번 (c++)

salmon16 2021. 4. 6. 15:44

출처 : 1149번: RGB거리 (acmicpc.net)

 

1149번: RGB거리

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

www.acmicpc.net

풀이 방법

dp 문제로 dp의 인덱스로 몇 번째 집인지, 자신이 선택한 색의 인덱스를 저장해 준다

기저사례로는  index 가 N-1일 땐 전 집에서 선택한 색을 제외한 두 색중 작은 값을 return한다

기저사례가 아닐시 for 문을 돌며 금지된 색이 아닐때 재귀 호출로 다음 인덱스와 선택한 색을 호출하고 그중 작은 값과 

자신이 선택한 비용을 return 하여 해결하였다.

#include <iostream>
#include <algorithm>
#include <memory.h>
#include <vector>


using namespace std;
int red[1001], green[1001], blue[1001];
int cost[1001][3];
// 집 인덱스 , 색 인덱스
int dp[1001][3], N, ans;
const int INF = 987654321;
// ban == 금지된 
int min_cost(int index, int ban) {
    // 기저 사례
    if (index == N-1) {
        int ret = INF;
        for (int i = 0;i < 3;i++) {
            if (ban != i) {
                ret = min(ret, cost[index][i]);
            }
        }
        return ret;
    }
    int& ret = dp[index][ban];
    if (ret != -1 ) return ret;
    ret = INF;
    for (int i = 0;i < 3;i++) {
        if (ban != i)  ret = min(ret,cost[index][i] + min_cost(index + 1, i));
    }
    return ret;
}

int main(void) {
	memset(dp, -1, sizeof(dp));
	cin >> N;
	for (int i = 0;i < N;i++) {
        cin >> cost[i][0] >> cost[i][1] >> cost[i][2];
	}
    ans = min(min_cost(0, 0), min(min_cost(0, 1), min_cost(0, 2)));
    cout << ans;


	return 0;
}

 

'Algorithm' 카테고리의 다른 글

큰 수의 법칙 (python)  (0) 2021.04.15
[algospot] 두니발 박사의 탈옥 (c++)  (0) 2021.04.14
[백준] 1,2,3 더하기 9095번 (c++)  (0) 2021.04.02
[백준] 1로 만들기 1463번 (c++)  (0) 2021.04.02
[algospot] Quantization (c++)  (0) 2021.04.02