문제
https://www.acmicpc.net/problem/1149
1149번: RGB거리
첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나
www.acmicpc.net
풀이
기본적으로 DP 다이나믹 프로그래밍 방식을 사용하는 문제인 것 같다.
배열에 RGB값을 각각 입력받고 DP 배열에다 RGB마다 최소값을 계산해서 저장해두는 방식을 사용했다.
i번째를 찾기 위해서 나름의 점화식?을 세워보았는데 밑의 3개의 식 중 최소값을 찾아서 출력하는 방식을 사용했다.
dp[i][0] = arr[i][0] + min(dp[i-1][1], dp[i - 1][2]);
dp[i][1] = arr[i][1] + min(dp[i-1][2], dp[i - 1][0]);
dp[i][2] = arr[i][2] + min(dp[i-1][1], dp[i - 1][0]);
소스 코드
#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <cctype>
#include <set>
#include <string.h>
using namespace std;
int N;
int arr[1001][3];
int dp[1001][3];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[i][0];
cin >> arr[i][1];
cin >> arr[i][2];
}
dp[0][0] = arr[0][0];
dp[0][1] = arr[0][1];
dp[0][2] = arr[0][2];
for (int i = 1; i < N; i++) {
dp[i][0] = arr[i][0] + min(dp[i-1][1], dp[i - 1][2]);
dp[i][1] = arr[i][1] + min(dp[i-1][2], dp[i - 1][0]);
dp[i][2] = arr[i][2] + min(dp[i-1][1], dp[i - 1][0]);
}
cout << min(min(dp[N - 1][0], dp[N - 1][1]), dp[N - 1][2]) << '\n';
}
'Programming Practice > BOJ' 카테고리의 다른 글
[BOJ] 백준 2407 조합 (C++) (0) | 2022.04.21 |
---|---|
[BOJ] 백준 15650 N과 M (2) (C++) (0) | 2022.04.20 |
[BOJ] 백준 16236 아기상어 (C++) (0) | 2022.04.19 |
[BOJ] 백준 1029 곱셈 (C++) (0) | 2022.04.19 |
[BOJ] 백준 16928 뱀과 사다리 게임 (C++) (0) | 2022.04.11 |