Notice
250x250
Recent Posts
Recent Comments
Link
넘치게 채우기
[BOJ] 1149 - RGB거리 본문
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 |