백준 1149 - RGB거리
생각 및 접근
- 처음에 예제 입력 값이 무엇인지 헷갈렸지만, 각 집마다 색깔을 칠하는 가격이 달랐던 것이다.
dp[i][j]
- i번째 집까지 색칠했고, i번째 집에는 j의 색깔로 칠했을 때 비용의 최솟값을 저장한다.
- 색깔은 총 3가지고, 집의 범위는 1000개까지 이므로
dp[1001][3]
로 선언하였다. dp[i][0]
를 구하려고 할 때, 이전 집(i - 1번째 집)에서 칠한 색깔은 1 또는 2여야 하므로min(dp[i - 1][1] + arr[i][0], dp[i - 1][2] + arr[i][0]);
와 같이 점화식을 세워볼 수 있겠다.dp[i][1]
,dp[i][2]
는 위와 동일한 방식으로 아래와 같은 점화식을 세울 수 있다.dp[i][1] = min(dp[i - 1][0] + arr[i][1], dp[i - 1][2] + arr[i][1]);
dp[i][2] = min(dp[i - 1][0] + arr[i][2], dp[i - 1][1] + arr[i][2]);
코드
#include <bits/stdc++.h>
using namespace std;
int n, arr[1001][3], dp[1001][3];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> arr[i][0] >> arr[i][1] >> arr[i][2];
}
for (int i = 1; i <= n; i++) {
dp[i][0] = min(dp[i - 1][1] + arr[i][0], dp[i - 1][2] + arr[i][0]);
dp[i][1] = min(dp[i - 1][0] + arr[i][1], dp[i - 1][2] + arr[i][1]);
dp[i][2] = min(dp[i - 1][0] + arr[i][2], dp[i - 1][1] + arr[i][2]);
}
cout << min({ dp[n][0], dp[n][1], dp[n][2] });
}
채점 결과
'Coding Test > acmicpc' 카테고리의 다른 글
백준 1699 - 제곱수의 합 (c++) (0) | 2020.08.16 |
---|---|
백준 12865 - 평범한 배낭 (c++) (0) | 2020.08.15 |
백준 15989 - 1, 2, 3 더하기 4 (c++) (0) | 2020.08.12 |
백준 1890 - 점프 (c++) (0) | 2020.08.10 |
백준 11048 - 이동하기 (c++) (0) | 2020.08.10 |