RGB거리
20 July 2019
문제 : https://www.acmicpc.net/problem/1149
이번은 i번째 집을 각각의 색으로 칠할 때, 1~i번째 집을 모두 칠하는 최소 비용으로 부분문제를 풀어보도록 하겠습니다.
#include<stdio.h>
#define MIN(a,b) (((a)<(b))?(a):(b))
static int** color_cost;
int main(void) {
int N, red, green, blue;
scanf("%d", &N);
color_cost = new int*[N];
for (int i = 0; i < N; i++)
{
color_cost[i] = new int[3];
scanf("%d %d %d", &red, &green, &blue);
if (i == 0)
{
color_cost[i][0] = red;
color_cost[i][1] = green;
color_cost[i][2] = blue;
}
else {
color_cost[i][0] = MIN(color_cost[i-1][1], color_cost[i - 1][2]) + red;
color_cost[i][1] = MIN(color_cost[i - 1][0], color_cost[i - 1][2]) + green;
color_cost[i][2] = MIN(color_cost[i - 1][1], color_cost[i - 1][0]) + blue;
}
}
int min = color_cost[N-1][0];
for (int i = 1; i < 3; i++)
{
if (color_cost[N-1][i] < min)
{
min = color_cost[N - 1][i];
}
}
printf("%d\n", min);
return 0;
}
먼저 문제의 조건을 보도록 하겠습니다.R,G,B 중에서 색깔을 칠할 색을 하나 고르고, 그다음에는 중복되는 색을 칠할 수 없습니다.
따라서 R일 경우, 바로 전 값에서 G,B로 결정된 값 중에서 최소의 값,G일 경우, 바로 전 값에서 R,B로 결정한 값 중에서 최소의 값,B일 경우, 바로 전 값에서 R,G로 결정한 값 중에서 최소의 값을 골라주면 됩니다.
전체의 모든 입력을 마치고 마지막 R,G,B 각각의 값에서 가장 작은 값을 출력해주면 됩니다.