다이나믹 프로그래밍을 이용한 문제이므로 점화식을 구해야 했다.

점화식은 i가 R을 선택하는 경우(d[i][0]), G를 선택하는 경우(d[i][1]), B를 선택하는 경우(d[i][2])가 있으므로 총 점화식은 3개!

(i의 최솟값을 고르는게 최선의 경우가 아닐 수 있으므로 R,G,B를 각각 선택한 경우를 구하는 것이다.)

 

 

점화식: d[i][0] = Min(d[i - 1][1], d[i - 1][2]) + a[0];
          d[i][1] = Min(d[i - 1][0], d[i - 1][2]) + a[1];
          d[i][2] = Min(d[i - 1][0], d[i - 1][1]) + a[2];

 

나올 수 있는 경우의 수는 다음과 같다.

1번 집 -> R G B

2번 집 -> R 선택 : GR, BR   중 min

             G 선택 : RG, BG   중 min

             B 선택 : RB, GB    중 min

3번 집 -> R 선택 : RGR, BGR, RBR, GBR    중 min

             G 선택 : GRG, BRG, RBG, GBG    중 min

             B 선택 : GRB, BRB, RGB, BGB     중 min

                         '

                         '

                         '

N번 집 -> .............

 

 

 

다음과 같은 예제를 이용해서 점화식을 이해해보자면,

  R G B
1 1 100 200
2 1 201 101
3 202 102 1

1번 집 -> R(1) G(100) B(200)

2번 집 -> R 선택 : GR(100+1), BR(200+1)  

             G 선택 : RG(200+201), BG(1+201)   

             B 선택 : RB(1+101), GB(100+101)   

3번 집 -> R 선택 : RGR, BGR, RBR, GBR   

             G 선택 : GRG, BRG, RBG, GBG    

             B 선택 : GRB, BRB, RGB, BGB     

 

3번 집의 경우에서 취소선은 이미 2번집에서 걸러진 경우이다. 따라서 항상 2가지 경우의 수만 남으므로 점화식이 성립한다는 것을 볼 수 있다.

 

 

코드는 다음과 같다.

// RGB 거리 (실버1)
#include <iostream>

using namespace std;

//점화식: d[i][0] = Min(d[i - 1][1], d[i - 1][2]) + a[0];
//		  d[i][1] = Min(d[i - 1][0], d[i - 1][2]) + a[1];
//		  d[i][2] = Min(d[i - 1][0], d[i - 1][1]) + a[2];

int** d;
int** RGB;

void dynamic(int x) {

	if (x == 0) return;

	dynamic(x - 1);

	d[x][0] = min(d[x - 1][1], d[x - 1][2]) + RGB[x][0];
	d[x][1] = min(d[x - 1][0], d[x - 1][2]) + RGB[x][1];
	d[x][2] = min(d[x - 1][0], d[x - 1][1]) + RGB[x][2];

}

int main() {
	int N; cin >> N;

	RGB = new int* [N + 1]{};
	d = new int* [N + 1]{};
	d[0] = new int[3]{};
	RGB[0] = new int[3]{};
	for (int i = 1;i < N + 1;i++) {
		d[i] = new int[3]{};
		RGB[i] = new int[3]{};
		cin >> RGB[i][0] >> RGB[i][1] >> RGB[i][2];
	}

	dynamic(N);

	cout << min(d[N][0],min(d[N][1],d[N][2]));

	return 0;
}

// 2020KB , 0ms

'coding > baekjoon_codingstudy' 카테고리의 다른 글

14891 톱니바퀴 (골드 5)  (0) 2021.10.05
18239 편안한 수열 만들기 (골드 3)  (0) 2021.08.19
11657 타임머신 (골드 4)  (0) 2021.08.15
4386 별자리 만들기 (골드 4)  (0) 2021.08.15
17404 RGB 거리2 (골드 4)  (0) 2021.08.15

+ Recent posts