Link https://www.acmicpc.net/problem/1149
소스결과 2012 KB / 0 ms
출처 Backjoon
언어 C++ 17
분류 다이나믹프로그래밍
설명
이웃한 집과 같은색으로 칠하지 않으면서 모든 집을 칠할 때 드는 비용의 최솟값을 출력하는 문제
이전 집의 색을 기억해서 같은 색이면 그 색을 제외하고 최솟값을 구해 마지막까지 칠하는 경우
모든 경우에서 최솟값을 선택하는 그리디 알고리즘을 적용시키면 문제의 정답이 나오지는 않는다.
같은 값이 존재하는 경우 위치에 따라 다른 결과 값이 나올 수 있다는 점을 유의해야한다.
또한 매번 최선의 선택이 정답이 되지 않기 때문에 모든 경우에 대해서 검사를 해야 한다.
DFS로 풀어나가면 시간 초과가 나온다.
점화식은
첫 번쨰 경우를 제외하고 이전 집의 색과 다른 집에서의 합이 최소가 되는 경우를 저장하는 점화식을 가진다.
dpTable[i][j] = RGB_val[i][j] + min(dpTable[i - 1][(j + 1) % 3], dpTable[i - 1][(j + 2) % 3]); ( 단 i > 0 )
소스코드
#include <iostream>
using namespace std;
const int MAX = 1000;
int tcc;
int RGB_val[MAX + 1][3];
int dpTable[MAX + 1][3];
int myMin(int val1, int val2)
{
return val1 > val2 ? val2 : val1;
}
int main()
{
cin >> tcc;
for (int i = 0; i < tcc; i++)
for (int j = 0; j < 3; j++)
cin >> RGB_val[i][j];
for (int i = 0; i < 3; i++)
dpTable[0][i] = RGB_val[0][i];
for (int i = 1; i < tcc; i++)
{
for (int j = 0; j < 3; j++)
dpTable[i][j] = RGB_val[i][j] + myMin(dpTable[i - 1][(j + 1) % 3], dpTable[i - 1][(j + 2) % 3]);
}
int minVal = dpTable[tcc-1][0];
for (int i = 1; i < 3; i++)
if (minVal > dpTable[tcc - 1][i])
minVal = dpTable[tcc - 1][i];
cout << minVal;
return 0;
}
'Algorithm > Dynamic Programming' 카테고리의 다른 글
BaekJoon 11726 2xn 타일링 (0) | 2019.01.14 |
---|---|
BaekJoon 2193 이친수 (0) | 2019.01.14 |
BaekJoon 1003 피보나치 함수 (0) | 2019.01.14 |
BaekJoon 2292 벌집 (0) | 2019.01.13 |
BaekJoon 1699 제곱수의 합 (0) | 2019.01.12 |