#문제
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
#풀이 & 학습한 내용
각각의 집에 대해 빨강, 초록, 파랑으로 칠했을 때의 Optimization(이 문제에선 비용의 최솟값)을 따로 살펴본다. 그리고 dp[i][0]을 "i번째 집을 빨강으로 칠했을 때의 첫번째 집부터 i번째 집까지의 비용합의 최솟값"으로 정의한다. dp[i][1], dp[i][2]는 앞의 정의에서 빨강을 초록, 파랑으로 바꾸어 생각한다. 아래 코드의 18~20행에 해당하는 optimal substructure를 통해 for문으로 dp배열을 1부터 N까지 채워나간다. 그리고 정답은 dp[N][0], dp[N][1], dp[N][2] 중에 최솟값이다.
#소스코드
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include<iostream>
#include<algorithm>
using namespace std;
int p[1002][3];
int dp[1002][3];
int main(void) {
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> p[i][0] >> p[i][1] >> p[i][2];
}
dp[1][0] = p[1][0]; dp[1][1] = p[1][1]; dp[1][2] = p[1][2];
for (int i = 2; i <= N; i++) {
dp[i][0] = min({ dp[i - 1][1] , dp[i - 1][2] }) + p[i][0];
dp[i][1] = min({ dp[i - 1][0] , dp[i - 1][2] }) + p[i][1];
dp[i][2] = min({ dp[i - 1][0] , dp[i - 1][1] }) + p[i][2];
}
cout << min({dp[N][0], dp[N][1], dp[N][2]}) << '\n';
}
|
cs |
github.com/HoYoungChun/BOJ_algorithm/blob/master/Dynamic_Programming/BOJ_1149.cpp
HoYoungChun/BOJ_algorithm
Baekjoon Online Judge problem solving by C++. Contribute to HoYoungChun/BOJ_algorithm development by creating an account on GitHub.
github.com
'Algorithm > Dynamic Programming' 카테고리의 다른 글
| [C++] 백준 11057번 : 오르막 수 (S1) (0) | 2020.11.11 |
|---|---|
| [C++] 백준 1309번 : 동물원 (S1) (0) | 2020.11.11 |
| [C++] 백준 9252번 : LCS 2 (G5) (0) | 2020.11.11 |
| [C++] 백준 9251번 : LCS (G5) (0) | 2020.11.11 |
| [C++] 백준 2225번 : 합분해 (G5) (0) | 2020.11.10 |