View

반응형

 

알고리즘 분류: 다이나믹 프로그래밍

문제 링크: https://www.acmicpc.net/problem/1149

 

1149번: RGB거리

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

www.acmicpc.net

 

 

 

【 풀이 】

 

한층 밑으로 내려갈 때마다 각 칸에 맞는 경우의 수 중에 최솟값을 저장하고 마지막 값들 중 최솟값을 출력해주면 되는 문제이다.

최솟값을 계산해 저장하는 배열을 dp, 원본 배열은 rgb라고 하자.

 

dp[0][0] = rgb[0][0]
dp[0][1] = rgb[0][1]
dp[0][2] = rgb[0][2]

 

가 될 것이다.

 

한층 내려갔을 때는 각 칸마다 경우의 수가 두가지 있다.

 

dp[1][0] = min( dp[0][1], dp[0][2] ) + rgb[1][0]

dp[1][1] = min( dp[0][1], dp[0][2] ) + rgb[1][0]

dp[1][2] = min( dp[0][1], dp[0][2] ) + rgb[1][0]

 

즉, 바로 윗 층의 자신의 칸을 제외두칸 중 최솟값구하고자 하는 칸의 원래 숫자를 더해서 저장해가면 된다.

이 식을 일반화 하면,

 

dp[i][0] = min( dp[i - 1][1], dp[i - 1][2] ) + rgb[i][0]
dp[i][1] = min( dp[i - 1][0], dp[i - 1][2] ) + rgb[i][1]
dp[i][2] = min( dp[i - 1][0], dp[i - 1][1] ) + rgb[i][2]

 

가 된다.

 

 

【 코드 】

 

#include<iostream>
#include<algorithm>
using namespace std;

int rgb[1001][3];
int dp[1001][3];

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

	for (int i = 0; i < n; i++) 
		cin >> rgb[i][0] >> rgb[i][1] >> rgb[i][2];

	dp[0][0] = rgb[0][0];
	dp[0][1] = rgb[0][1];
	dp[0][2] = rgb[0][2];

	for (int i = 1; i < n; i++) {
		dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + rgb[i][0];
		dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + rgb[i][1];
		dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + rgb[i][2];
	}

	cout << *min_element(dp[n - 1], dp[n - 1]+3);

	return 0;
}

 

 

728x90
반응형

'Problem Solving > Baekjoon' 카테고리의 다른 글

[백준] 28422: XOR 카드 게임  (0) 2024.04.08
[백준] 7576번: 토마토 [C++]  (1) 2023.10.01
[백준] 1074번: Z [C++]  (0) 2023.09.30
[백준] 2630번: 색종이 만들기 [C++]  (0) 2023.09.29
[백준] 1697번: 숨바꼭질 [C++]  (0) 2023.09.28
Share Link
reply
250x250
반응형
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31