반응형
Notice
Recent Posts
Recent Comments
Link
«   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
Archives
Today
Total
관리 메뉴

코딩하기 좋은날

백준 1149 RGB 거리 본문

백준(Baekjoon) 문제

백준 1149 RGB 거리

huiung 2019. 2. 22. 21:22
반응형

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

문제와 채점은 위 사이트에서 확인 하실 수 있습니다

 

이 문제는 N개의 집을 칠 할 때 각각의 줄에 R G B의 색으로 칠하는 비용을 입력 받습니다. 이때 서로 이웃한 i-1과 i+1번째 집은 같은색을 칠할 수 없다는 제약이 있습니다. 따라서 각각의 색깔로 칠했 을때를 dp를 이용하여 모두 저장후 최종적으로 값들을 비교해서 가장 작은 값을 출력해야 합니다.

 

예를들어 i번째 집을 빨간색으로 색칠 한다면 i-1번째 집을 파란색으로 색칠하는 비용과 초록색으로 색칠하는 비용중 더 적은 비용을 선택하면 됩니다.

 

dp[0][i] = min( dp[1][i-1] + red[i], dp[2][i-1] + red[i]); 따라서 각 색깔마다 이러한 점화식이 만들어지게 됩니다.

 

dp에 각각의 색깔을 i번째 집에 칠할때의 비용들을 저장해야 하므로 2차원으로 선언하여 첫번째 인덱스는 색깔 i는 집의 번호를 나타냅니다.

 

다음은 코드입니다.

 

#include <iostream>

using namespace std;

int main(void) {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	int red[1001] = {0, };
	int blue[1001] = {0, };
	int green[1001] = {0, };
	int dp[3][1001] = {0, };
	int N; cin >> N;
	for(int i = 1; i <= N; i++) {
		cin >> red[i];
		cin >> blue[i];
		cin >> green[i];
	}
	dp[0][1] = red[1];
	dp[1][1] = blue[1];
	dp[2][1] = green[1];
	
	for(int i = 2; i <= N; i++) {
		dp[0][i] = min( dp[1][i-1] + red[i], dp[2][i-1] + red[i]); 
		dp[1][i] = min( dp[0][i-1] + blue[i], dp[2][i-1] + blue[i]); 
		dp[2][i] = min( dp[0][i-1] + green[i], dp[1][i-1] + green[i]); 
	}
	int result;
	result = min(dp[0][N], dp[1][N]);
	result = min(result, dp[2][N]);
	cout<< result;
	return 0;
}

 

반응형

'백준(Baekjoon) 문제' 카테고리의 다른 글

백준 1654 랜선 자르기  (0) 2019.02.24
백준 2579 계단 오르기  (0) 2019.02.22
백준 1932 정수 삼각형  (0) 2019.02.22
백준 6591 이항 쇼다운  (0) 2019.02.22
백준 1676 팩토리얼 0의 개수  (0) 2019.02.21