백준/실랜디, 골랜디

[백준] C++ RGB거리(1149)

2zreal 2024. 12. 28. 18:54

 

이 문제는 이웃하는 집은 같은 색으로 칠하면 않고 비용을 최소화하는 문제이다.

 

문제풀이방법

1. 우선 세 방향에서 접근해야한다. (왼쪽, 중앙, 오른쪽)  처음 집을 빨강으로 칠하면 다음 집은 초록이나 파랑으로 칠해야한다.

2. 위와 같은 방식으로 처음집을 빨강, 초록, 파랑으로 모두 칠해보고 그 다음집에 색칠 가능한 색깔을 고려해서 다음집에 최소값을 저장한다.

 

이 그림처럼 값을 더해보고 만약 저장되어 있는 값보다 더 작다면 값을 갱신한다. 전형적인 DP문제이다.

 

#include <iostream>
#define INF 987654321;
using namespace std;

int arr[1001][3];
int DP[1001][3];

int main(void)
{
	int N = 0;
	cin >> N;

	for (int i = 0; i < N; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cin >> arr[i][j];
			DP[i][j]= INF;
		}
	}

	for (int i = 0; i < 3; i++)
	{
		DP[0][i] = arr[0][i];
	}

	
	for (int i = 0; i < N - 1; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)
			{
				if (j != k && DP[i + 1][k] > DP[i][j] + arr[i + 1][k])
				{
					DP[i + 1][k] = DP[i][j] + arr[i + 1][k];
				}
			}
		}
	}

	int min = INF;

	for (int i = 0; i < 3; i++)
	{
		if (DP[N - 1][i] < min)
		{
			min = DP[N - 1][i];
		}
	}

	cout << min;

	return 0;
}

'백준 > 실랜디, 골랜디' 카테고리의 다른 글

[백준] C++ 부분합(1806)  (0) 2025.01.08
[백준] 쉬운 최단거리(14940)  (0) 2024.12.29
[백준] C++ 좌표압축(18870)  (0) 2024.12.27
[백준] C++ AC(5430)  (1) 2024.12.27
[백준] 스택 수열(1874)  (1) 2024.12.26