백준 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

+ Recent posts