Skip to content

Commit 01439d8

Browse files
committed
[Gold IV] Title: RGB거리 2, Time: 0 ms, Memory: 2168 KB -BaekjoonHub
1 parent e11a186 commit 01439d8

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Gold IV] RGB거리 2 - 17404
2+
3+
[문제 링크](https://www.acmicpc.net/problem/17404)
4+
5+
### 성능 요약
6+
7+
메모리: 2168 KB, 시간: 0 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍
12+
13+
### 제출 일자
14+
15+
2024년 4월 28일 02:22:02
16+
17+
### 문제 설명
18+
19+
<p>RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.</p>
20+
21+
<p>집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.</p>
22+
23+
<ul>
24+
<li>1번 집의 색은 2번, N번 집의 색과 같지 않아야 한다.</li>
25+
<li>N번 집의 색은 N-1번, 1번 집의 색과 같지 않아야 한다.</li>
26+
<li>i(2 ≤ i ≤ N-1)번 집의 색은 i-1, i+1번 집의 색과 같지 않아야 한다.</li>
27+
</ul>
28+
29+
### 입력
30+
31+
<p>첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.</p>
32+
33+
### 출력
34+
35+
<p>첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.</p>
36+
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#include <iostream>
2+
#include <algorithm>
3+
#include <vector>
4+
5+
using namespace std;
6+
7+
vector<vector<int>> rgb;
8+
9+
int main() {
10+
ios_base::sync_with_stdio(0);
11+
cin.tie(0);
12+
13+
int n;
14+
cin >> n;
15+
rgb.assign(n+1, vector<int>(3, 0));
16+
vector<vector<int>> dp(n+1, vector<int>(3, 0));
17+
18+
for (int i = 1; i <= n; i++) {
19+
for (int j = 0; j < 3; j++) {
20+
cin >> rgb[i][j];
21+
}
22+
}
23+
24+
int ans = 10000000;
25+
for (int k = 0; k < 3; k++) {
26+
for (int i = 0; i < 3; i++) {
27+
if (i == k) dp[1][i] = rgb[1][i];
28+
else dp[1][i] = 10000000;
29+
}
30+
for (int i = 2; i <= n; i++) {
31+
dp[i][0] = min(dp[i-1][1], dp[i-1][2]) + rgb[i][0];
32+
dp[i][1] = min(dp[i-1][0], dp[i-1][2]) + rgb[i][1];
33+
dp[i][2] = min(dp[i-1][0], dp[i-1][1]) + rgb[i][2];
34+
}
35+
for (int i = 0; i < 3; i++) {
36+
if (i != k) ans = min(ans, dp[n][i]);
37+
}
38+
}
39+
cout << ans;
40+
41+
return 0;
42+
}

0 commit comments

Comments
 (0)