반응형
https://www.acmicpc.net/problem/1149
기본적인 DP문제입니다.
문제를 푸는 아이디어는 집을 색칠할 수 있는 3가지 색깔의 경우의수를 모두다 구해보는 것입니다.
코드로는
for (int i = 1; i < N; i++) {
dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + input[i][0];
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + input[i][1];
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + input[i][2];
}
이렇게 될것입니다.
dp[i][j]는 i번째 집을 j색깔로 칠했을때의 최소비용입니다.
따라서 dp[i][0]은 i번째 집을 0번 페인트로 칠했을때 비용 + i-1번째 집을 1번 페인트나 2번 페인트 칠한 둘 중의 최소값이랑 똑같습니다.
소스코드
#include <iostream>
#include <algorithm>
using namespace std;
int N, input[1000][3], dp[1000][3], ans=1000006;
int main() {
cin >> N;
for (int i = 0; i < N; i++) cin >> input[i][0] >> input[i][1] >> input[i][2];
for (int i = 0; i < 3; i++) dp[0][i] = input[0][i];
for (int i = 1; i < N; i++) {
dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + input[i][0];
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + input[i][1];
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]) + input[i][2];
}
for (int i = 0; i < 3; i++) ans = min(ans, dp[N - 1][i]);
cout << ans;
}
반응형
'백준 > 일반 문제' 카테고리의 다른 글
[백준/BOJ] 11726 - 2×n 타일링 (c++) (DP) (0) | 2022.04.09 |
---|---|
[백준/BOJ] 1003 - 피보나치 함수(c++) (DP) (0) | 2022.04.08 |
[백준/BOJ] 10815 - 숫자 카드 (c++) (이분탐색) (0) | 2022.04.08 |
[백준/BOJ] 21609 - 상어 중학교 (c++) (0) | 2022.04.07 |
[백준/BOJ] 20057 - 마법사 상어와 토네이도 (c++) (0) | 2022.04.06 |