문제
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
'백준 알고리즘' 카테고리의 다른 글
<백준 알고리즘> 11053번: 가장 긴 증가하는 부분 수열 (0) | 2021.02.21 |
---|---|
<백준 알고리즘> 10844번: 쉬운 계단 수 (0) | 2021.02.21 |
<백준 알고리즘> 1904번: 01타일 (0) | 2021.02.21 |
<백준 알고리즘> 9184번: 신나는 함수 실행 (0) | 2021.02.21 |
<백준 알고리즘> 10816번: 숫자 카드 2 (0) | 2021.02.20 |