Posts 17404 RGB Distance 2
Post
Cancel

17404 RGB Distance 2

17404 RGB Distance 2

알고리즘 : DP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
1. bottom-top 방식으로 품
2. DP 구성 : (현재 깊이, 이전에 고른 색깔)칸에 현재 깊이에서의 최솟값 저장.
3. DP 작동
	a. 첫번째 집은 for문으로 하나씩 들어감.
	b. 두번째 집부터 이전에 고른 색이 아닌 색으로 이동
	c. 마지막집 + 1에 도착하면 0을 리턴
	d. 마지막집은 0리턴 받은 것에 고른 색의 값 더함. 총 가능한 모든 색 값 중의 최솟값을 DP[deep][before]에 저장함
	e. 하나씩 올라가면서 DP에 저장
	f. DP에 저장돼있는게 있으면 바로 리턴
4. 주의점
	a. 첫번째 집이랑 마지막 집이랑 색깔이 달라야함 -> 첫번째 집의 색깔에 따라서도 상태가 달라짐
		-> DP구성을 첫번째 집의 상태까지 고려하여 해야함
		-> 하지만 나는 for문으로 첫번째 집은 하나씩 들어가고 나올때마다 DP를 초기화 해줬기에 괜찮음
	b. 고를 수 있는 색의 조건문 구성을 조심해야함
		before != 0 && (deep == numOfHouse -1 && first != 0)

		-> 이 조건문은, deep이 마지막집이 아닐때 뒷 조건문에서 false가 나와 집이 2개가 아닌이상에야 아예 작동을 안함.

		따라서 밑처럼 짜줘야한다.
		before != 0 && (deep != numOfHouse -1 || first != 0)
		뒷 조건문은, 마지막이 아닐 경우 true를 반환하고, 마지막집일때는 first가 0이 아니여야만 true가 나옴
		-> 잘 만족한다.

코드

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
49
50
51
52
53
54
#include <iostream>
#include <cstring>
#define MAX_HOUSE 1001
#define INFINITE 2000000000

using namespace std;

int numOfHouse, house[MAX_HOUSE][3], DP[MAX_HOUSE][3], first;

int getMinCost(int before, int deep);
int min(int a, int b) {
	return a < b ? a : b;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

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

	int minCost = INFINITE;
	for (int i = 0; i < 3; i++) {
		first = i;
		minCost = min(getMinCost(i, 1) + house[0][i], minCost);
		memset(DP, 0, sizeof(DP));
	}
	cout << minCost;
}

int getMinCost(int before, int deep) {
	if (deep == numOfHouse) {
		return 0;
	}
	if (DP[deep][before] != 0) {
		return DP[deep][before];
	}



	int a= INFINITE, b = INFINITE, c = INFINITE;
	if (before != 0 && (deep != numOfHouse -1 || first != 0))
		a = getMinCost(0, deep + 1) + house[deep][0];
	if (before != 1 && (deep != numOfHouse - 1 || first != 1))
		b = getMinCost(1, deep + 1) + house[deep][1];
	if (before != 2 && (deep != numOfHouse - 1 || first != 2))
		c = getMinCost(2, deep + 1) + house[deep][2];

	int tempMin = min(min(a, b), c);

	return DP[deep][before] = tempMin;
}
This post is licensed under CC BY 4.0 by the author.

17144 Samsung sw test

1753 최단경로

Comments powered by Disqus.