백준/일반 문제

[백준/BOJ] 1149 - RGB거리 (c++) (DP)

sem; 2022. 4. 8. 13:41
반응형

 

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

 

기본적인 DP문제입니다.

 

문제를 푸는 아이디어는 집을 색칠할 수 있는 3가지 색깔의 경우의수를 모두다 구해보는 것입니다.

 

코드로는

 

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

이렇게 될것입니다. 

 

dp[i][j]는 i번째 집을 j색깔로 칠했을때의 최소비용입니다.

 

따라서 dp[i][0]은 i번째 집을 0번 페인트로 칠했을때 비용 + i-1번째 집을 1번 페인트나 2번 페인트 칠한 둘 중의 최소값이랑 똑같습니다.


소스코드

#include <iostream>
#include <algorithm>

using namespace std;

int N, input[1000][3], dp[1000][3], ans=1000006;

int main() {
	cin >> N;
	for (int i = 0; i < N; i++) cin >> input[i][0] >> input[i][1] >> input[i][2];
	for (int i = 0; i < 3; i++) dp[0][i] = input[0][i];
	for (int i = 1; i < N; i++) {
		dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + input[i][0];
		dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + input[i][1];
		dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + input[i][2];
	}
	for (int i = 0; i < 3; i++) ans = min(ans, dp[N - 1][i]);
	cout << ans;
}
반응형