백준 1149번, RGB거리
백준 1149번 c++ 문제풀이
문제:
풀이:
- 다이나믹 프로그래밍으로 접근한다.
- 먼저 첫번째 집을 빨강, 초록, 파랑으로 칠했을 때의 값들을 저장한다.(각각의 색으로 칠했을 때의 최솟값을 저장하는데, 첫번째 선택이기 때문)
- 두번째 집부터는 현재 색칠하는 색의 가격과 이전 집에 저장된 최솟값들 중 조건에 맞는 색중에서 더 작은 값을 더해준다.
- 예를 들어 현재 집을 빨강으로 칠하면 이전 집이 파랑일 때의 최솟값과 초록일 때의 최솟값을 비교하여 더 작은 값을 더해 저장하는 것이다.
- 마지막 집까지 오면 마지막 집을 빨강, 파랑, 초록으로 칠했을 때의 최솟값들이 나오는데, 그 중 제일 작은 값이 모든 집을 최솟값으로 칠하는 비용이다.
코드:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int n;
void dp(vector<int> v[]){
int dp[n][3]; //i 번째 집을 빨간색, 파란색, 초록색으로 칠할 때 드는 최소비용
dp[0][0] = v[0][0]; //빨강
dp[0][1] = v[0][1]; //초록
dp[0][2] = v[0][2]; //파랑
//첫번째 집을 각각의 색으로 칠할 때 드는 최소비용
for(int i=1;i<n;i++){
for(int j=0;j<3;j++){
dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + v[i][0];
dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + v[i][1];
dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + v[i][2];
}
}
int min_v = min(min(dp[n-1][0],dp[n-1][1]),dp[n-1][2]);
cout << min_v;
}
int main(){
cin >> n;
vector<int> v[n];
for(int i=0;i<n;i++){
for(int j=0;j<3;j++){
int price;
cin >> price;
v[i].push_back(price);
}
}
dp(v);
return 0;
}
감사합니다.
This post is licensed under CC BY 4.0 by the author.