728x90
문제
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보다 작거나 같은 자연수이다.
출력
첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.
풀이
결국 이전에 선택한 색상만 안고르면 되는 문제다.
dp[i][color] = i 번째 집에서 집을 color로 칠할때 현재까지의 최소 비용
만약 현재 빨강색으로 집을 칠한다고 하면 i - 1번째 집을 색칠한 최소 비용 중 초록과 파랑의 비용과 합산해야 한다.
문제에서 주어진 조건에 따라 이전 집의 색상이 현재 칠하는 색상과 달라야 하기 때문이다.
사실 dp[i - 1]의 값은 dp[i]를 계산하고나서 쓸모가 없다. 토글링을 해주면 변수 r, g, b와 dp[3], prev[3]칸으로도 충분하다.
소스코드
출처
728x90
'PS > Baekjoon Online Judge' 카테고리의 다른 글
[백준 11726] 2×n 타일링 [Java] (0) | 2024.07.21 |
---|---|
[백준 06378] 디지털 루트 [Java] (0) | 2024.07.21 |
[백준 06322] 직각 삼각형의 두 변 [Python] (0) | 2024.07.20 |
[백준 13939] Imena [Java] (0) | 2024.07.18 |
[백준 02579] 계단 오르기 [C/C++] (0) | 2024.07.18 |