C++ 백준 1149번
by 너나나
백준 1149번 www.acmicpc.net/problem/1149
문제 : RGB거리에는 집이 N개 있다. 거리는 선분으로 나타낼 수 있고, 1번 집부터 N번 집이 순서대로 있다.
집은 빨강, 초록, 파랑 중 하나의 색으로 칠해야 한다. 각각의 집을 빨강, 초록, 파랑으로 칠하는 비용이 주어졌을 때, 아래 규칙을 만족하면서 모든 집을 칠하는 비용의 최솟값을 구해보자.
- 1번 집의 색은 2번 집의 색과 같지 않아야 한다.
- N번 집의 색은 N-1번 집의 색과 같지 않아야 한다.
- i(2 ≤ i ≤ N-1)번 집의 색은 i-1번, i+1번 집의 색과 같지 않아야 한다.
모든 집을 R,G,B 로 칠하는 최솟값을 구하는 문제이다. 각 집마다 비용이 다르다!!
a[i][j] = i번 집을 색 j로 칠하는 비용이라고 하고 (j는 0, 1, 2)
d[i][j] = i번 집을 색 j로 칠했을 때, 1~i번 집을 칠하는 비용의 최솟값이라고 하자.
그러면
d[i][0] = min(d[i-1][1] + d[i-1][2]) + a[i][0]
d[i][1] = min(d[i-1][0] + d[i-1][2]) + a[i][1]
d[i][2] = min(d[i-1][0] + d[i-1][1]) + a[i][2]
로 나타낼 수 있고 여기서 가장 작은 d[i][j] 값을 찾으면 된다.
#include<iostream>
#include<algorithm>
using namespace std;
int a[1001][3]; // i번 집을 색 j로 칠하는 비용
int d[1001][3]; // i번 집을 색 j로 칠했을 때, 1~i번 집을 칠하는 비용의 최솟값
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
for (int i = 1; i <= t; i++) {
for (int j = 0; j < 3; j++) {
cin >> a[i][j];
}
}
for (int i = 1; i <= t; i++) {
d[i][0] = min(d[i - 1][1], d[i - 1][2]) + a[i][0];
d[i][1] = min(d[i - 1][0], d[i - 1][2]) + a[i][1];
d[i][2] = min(d[i - 1][0], d[i - 1][1]) + a[i][2];
}
cout << min({ d[t][0], d[t][1], d[t][2] }) << '\n';
}
'study > 알고리즘' 카테고리의 다른 글
C++ 백준 9465번 (0) | 2021.01.05 |
---|---|
C++ 백준 1309번 (0) | 2021.01.04 |
C++ 백준 15988번 (0) | 2021.01.04 |
C++ 백준 1699번 (0) | 2021.01.02 |
C++ 백준 1912번 (0) | 2021.01.02 |
블로그의 정보
공부 기록
너나나