문제

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

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

입력

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

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

예제 입력 1

3
26 40 83
49 60 57
13 89 99

예제 출력 1

96

더보기

Solution

#include<stdio.h>
#include<stdlib.h>

int main(void)
{
	int N, **cost=NULL;

	scanf("%d", &N);
	cost=(int **)malloc(N*sizeof(int *));
	for(int n=0;n<N;n++)
		cost[n]=(int *)malloc(3*sizeof(int));

	for(int n=0;n<N;n++)
		for(int i=0;i<3;i++)
			scanf("%d", &cost[n][i]);

	for(int n=1;n<N;n++)
	{
		cost[n][0]=cost[n-1][1]<cost[n-1][2]?cost[n-1][1]+cost[n][0]:cost[n-1][2]+cost[n][0];
		cost[n][1]=cost[n-1][0]<cost[n-1][2]?cost[n-1][0]+cost[n][1]:cost[n-1][2]+cost[n][1];
		cost[n][2]=cost[n-1][0]<cost[n-1][1]?cost[n-1][0]+cost[n][2]:cost[n-1][1]+cost[n][2];
	}

	printf("%d\n", cost[N-1][0]<=cost[N-1][1]&&cost[N-1][0]<=cost[N-1][2]?cost[N-1][0]:cost[N-1][1]<=cost[N-1][0]&&cost[N-1][1]<=cost[N-1][2]?cost[N-1][1]:cost[N-1][2]);
	for(int n=0;n<N;n++)
		free(cost[n]);
	free(cost);
	return 0;
}
728x90

+ Recent posts