Backjoon Online Judge
"1149번 : 피보나치 수 3" 문제입니다.
문제 링크 : https://www.acmicpc.net/problem/1149
일단 문제에서 비용의 최솟값을 출력하기 위해 모든 선택 경우에서 나올 수 있는 비용을 알고 있어야 하고, 이를 구현하기 위해 DP를 이용하였습니다.
이때 문제의 조건을 만족하려면 현재 집을 칠해야 할 색은 이전집에 칠한 색깔이 아닌 색만을 칠할 수 있다는 사실을 확인했고 배열을 통해 검사하는 범위를 줄이기로 했습니다.
- 먼저 N <= 1000이므로 모든 집의 색깔을 저장할 3*1000의 배열을 선언하여 그 배열에 저장하였습니다.
- 이후 N에 따라 검사 결과를 저장할 total 배열에 비용의 최솟값을 저장했습니다. 이때 비용의 최솟값을 저장하기 위해 algorithm헤더에 포함된 min함수를 이용하였습니다.
- 비용은 현재 집에 칠할 색깔 별로 비용을 각각 구했으며 비용은 이전 집에 칠한 색깔의 최솟값 중 현재 집에 칠할 색깔과 같지 않은 최솟값 중 작은것을 더했습니다.
코드는 C++로 작성하였습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | #include <iostream> #include <algorithm> #define MAX 1000 using namespace std; int main() { int N, miniMum; int cost[MAX][3] = { 0 }; int total[MAX][3] = { 0 }; cin >> N; for(int i = 0; i < N; i++) { cin >> cost[i][0] >> cost[i][1] >> cost[i][2]; } total[0][0] = cost[0][0]; total[0][1] = cost[0][1]; total[0][2] = cost[0][2]; for (int i = 1; i < N; i++) { total[i][0] = cost[i][0] + min(total[i - 1][1], total[i - 1][2]); total[i][1] = cost[i][1] + min(total[i - 1][0], total[i - 1][2]); total[i][2] = cost[i][2] + min(total[i - 1][0], total[i - 1][1]); } cout << min(total[N - 1][0], min(total[N - 1][1], total[N - 1][2])); return 0; } | cs |
'Programming 문제풀이 > Backjoon Online Judge' 카테고리의 다른 글
2579번 : 계단 오르기 (0) | 2018.05.05 |
---|---|
1932번 : 숫자삼각형 (0) | 2018.05.01 |
1003번 : 피보나치 함수 (0) | 2018.04.01 |
2749번 : 피보나치 수 3 (0) | 2018.04.01 |
2748번 : 피보나치 수 2 (0) | 2018.04.01 |