넘치게 채우기

[BOJ] 1149 - RGB거리 본문

PS/BOJ

[BOJ] 1149 - RGB거리

riveroverflow 2024. 10. 26. 16:24
728x90
반응형

https://www.acmicpc.net/problem/1149

BOJ - RGB거리

문제 유형: 다이나믹 프로그래밍(dp)

문제 난이도: Silver I

시간 제한: 0.5초

메모리 제한: 128MB

 

문제

RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.

집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.

  • 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
  • N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
  • i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.

입력

첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 같은 자연수이다.

 

출력

첫째 줄에 모든 집을 칠하는 비용의 최솟값을 출력한다.

 

풀이

dp[i][0] = i번째집에 0번을 반드시 고르는 0번부터 i번까지의 최소 비용으로 한다.

이전 dp에서 다른 색깔 값들 중 더 저렴한 값과 현재 집의 현재 색깔 비용을 더해서 저장한다.

 

dp[n-1]의 최소값을 반환한다.

 

코드

C++

#include <bits/stdc++.h>

using namespace std;

int main(int argc, char *argv[]) {
  int n;
  cin >> n;
  vector<vector<int>> info(n, vector<int>(3));
  vector<vector<int>> dp(n, vector<int>(3));

  for (int i = 0; i < n; ++i) {
    cin >> info[i][0] >> info[i][1] >> info[i][2];
    dp[i][0] = info[i][0];
    dp[i][1] = info[i][1];
    dp[i][2] = info[i][2];
  }
  for (int i = 1; i < n; ++i) {
    dp[i][0] += min(dp[i - 1][1], dp[i - 1][2]);
    dp[i][1] += min(dp[i - 1][2], dp[i - 1][0]);
    dp[i][2] += min(dp[i - 1][0], dp[i - 1][1]);
  }

  cout << *min_element(dp[n - 1].begin(), dp[n - 1].end()) << "\n";

  return 0;
}
728x90
반응형

'PS > BOJ' 카테고리의 다른 글

[BOJ] 9663 - N-Queen  (0) 2024.10.28
[BOJ] 2448 - 별 찍기 - 11  (0) 2024.10.27
[BOJ] 16953 - A → B  (0) 2024.10.25
[BOJ] 15663 - N과 M(9)  (0) 2024.10.25
[BOJ] 15654 - N과 M(5)  (0) 2024.10.24