dp 백준 1149번 RGB거리

2020. 1. 30. 19:37Algorithm/문제풀이

https://www.acmicpc.net/problem/1149

 

1149번: RGB거리

RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이고, 첫 집과 마지막 집은 이웃이 아니다. 각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠하는 비용의 최솟값을 구하는 프로그램을 작성하시오.

www.acmicpc.net

RGB 거리는 각각의 모든 집들의 비용을 최소로 만들면서 서로 겹치지 않게 만드는 문제이다. 위 문제는 결론적으로 

현재의 경우가 이전의 같은 색을 제외하고 다른 두가지 색을 선택한다는 조건이 있다. 현재와 다른 이전 두 색 을 고르면서 최소의 값으로 만드는 점에 집중하면 된다. 

price[2][0] = min(price[1][1], price[1][2]) + home[2][0];
price[2][1] = min(price[1][0], price[1][2]) + home[2][1];
price[2][2] = min(price[1][0], price[1][1]) + home[2][2];

위와 같이 점화식을 세워면 저도 처음에는 생각이 안나 다른 사람의 풀이를 참고하여 해결했습니다. 이럴 때 마다 제 자신의 부끄럽습니다. 왜 이렇게 멍청하나 자책감도 들구요 그래서 완벽히 내껄로 만들려고합니다. 할튼

 

세 경우의 최종 가격은 3개여야 하기 때문에 각 부분 당 이전 단계 두 부분 중 큰 값을 선택하여 그 단계의 돈과 더해주면 됩니다. 결국 아래와 같은 점화식이 완성됩니다. 

dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + arr[i][0];
dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + arr[i][1];
dp[i][2] = min(dp[i-1][1], dp[i-1][0]) + arr[i][2];
더보기
#include <cstdio>
#include <algorithm>
using namespace std;

int N;
int arr[1002][3];
int dp[1002][3];

int main(){
	scanf("%d", &N);

	for(int i = 0; i < N; i++)
		scanf("%d %d %d", &arr[i][0], &arr[i][1], &arr[i][2]);

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

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

	printf("%d", *min_element(dp[N-1], dp[N-1]+3));
}