(c++)1149_RGB거리 πŸ’”πŸ’šπŸ’™

이아름·2022λ…„ 8μ›” 19일
0

μ½”λ”©ν…ŒμŠ€νŠΈ

λͺ©λ‘ 보기
1/6
post-thumbnail

πŸ˜€ λ°±μ€€ RGB거리 (c++)

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

μ²˜μŒμ—λŠ” μž¬κ·€ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ„œ ν’€ 수 μžˆμ„ 것이라고 μƒκ°ν•΄μ„œ μž¬κ·€λ‘œ 문제λ₯Ό ν’€μ–΄λ³΄μ•˜λ‹€.

ν•˜μ§€λ§Œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ°œμƒν•˜μ˜€κ³  μ§ˆλ¬Έμ„ λ³΄λ‹€λ³΄λ‹ˆ DPλ₯Ό μ‚¬μš©ν•΄μ„œ ν‘ΈλŠ” 방법이 μžˆλ‹€λŠ” 것을 μ•Œκ²Œλ˜μ—ˆλ‹€.

λ‚΄ λ‘œμ§μ„ κ°„λ‹¨νžˆ μ„€λͺ…ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • 1번째(μ‹œμž‘)에 ν•΄λ‹Ήν•˜λŠ” 각 색(R,G,B)의 가격을 minCostsλΌλŠ” 배열에 λ„£λŠ”λ‹€.
  • i = 2 .. N κΉŒμ§€ 각 색(R,G,B)을 μ„ νƒν–ˆμ„ λ•Œ ꡬ할 수 μžˆλŠ” μ΅œμ†Œ 가격을 minCosts[i]에 λ„£λŠ”λ‹€.
    --> R일 경우 G,B만 / G일 경우 R,B만 / B일 경우 R,G만 선택 κ°€λŠ₯
    --> 선택가λŠ₯ν•œ 색 쀑 가격이 μž‘μ€ 색을 μ„ νƒν•˜λ©΄ 그것이 μ΅œμ„ μ˜ 선택이 λœλ‹€.
  • minCosts[N]의 값이 ꡬ할 수 μžˆλŠ” μ΅œμ†Œκ°’μ΄ λœλ‹€.

#include <iostream>
#include <vector>
#include <algorithm>
#include <limits.h>
using namespace std;

int N;
vector<vector<int>> costs; //가격
vector<vector<int>> minCosts(1001, {INT_MAX,INT_MAX,INT_MAX}); //각 색칠별 μ΅œμ†Œκ°€κ²©

//ν•΄λ‹Ή indexμ—μ„œ 각 색을 μ„ νƒν–ˆμ„ λ•Œ λ‚˜μ˜¬μˆ˜ μžˆλŠ” μ΅œμ†Œ 가격을 ꡬ함
void getCosts(int index) {
	for (int i = 0; i < 3; i++) { 
		vector<int> canCosts;
		for (int k = 0; k < 3; k++) {
			if (k != i) {
				canCosts.push_back(minCosts[index-1][k]);
			}
		}
		int selected = min(canCosts[0], canCosts[1]);
		int nowCost = selected + costs[index][i];
		minCosts[index][i] = min(minCosts[index][i], nowCost);
	}
}

int main() {
	cin >> N; //μž…λ ₯
	costs.push_back({});
	for (int i = 0; i < N; i++) {
		int c1, c2, c3; cin >> c1 >> c2 >> c3;
		costs.push_back({ c1,c2,c3 });
	}
	minCosts[1] = costs[1]; //μ‹œμž‘
	for (int i = 2; i <= N; i++) {
		getCosts(i);
	}
	int answer = min(minCosts[N][0], minCosts[N][1]);
	answer = min(answer, minCosts[N][2]);
	cout << answer << endl;
	return 0;
}
profile
λ°˜κ°‘μŠ΅λ‹ˆλ‹€

0개의 λŒ“κΈ€