풀이
백트래킹 & DP
0번째 집부터 차례대로 N-1 까지 칠한다.
(재귀함수의 기저조건이 n>=N return 0이 된다.)
k번째 집을 칠할 때 이전에 칠한 색을 prev로 받고 prev일 때 k번째 칠할 수 있는 경우의 최솟값이 DP에 있는지 확인한다.
- 있다면 그 값을 return한다.
- 없다면 백트래킹으로 현재 비용+다음 최솟값 중 가장 작은 값을 구해서 기록하고 return한다.
최소 결과를 출력한다.
코드
//! 2020.03.12
// TODO BJ1149_RGB거리.cpp
#include<cstdio>
using namespace std;
const int MAX = 1050;
const int INF = 987654321;
int N;
int myMap[MAX][3];
int DP[3][MAX];
int getMin(int n1,int n2){
if(n1<n2) return n1;
else return n2;
}
int getResult(int prev,int idx){
if(idx>=N) return 0;
int& ret = DP[prev][idx];
if(ret!=-1) return ret;
ret = INF;
if(idx==0){
for(int i=0;i<3;i++){
ret = getMin(ret,myMap[idx][i]+getResult(i,idx+1));
}
}else{
for(int i=0;i<3;i++){
if(i!=prev)
ret = getMin(ret,myMap[idx][i]+getResult(i,idx+1));
}
}
// printf("idx : %d, ret : %d\n",idx,ret);
return ret;
}
int main(){
scanf("%d",&N);
for(int i=0;i<N;i++){
for(int j=0;j<3;j++){
scanf("%d",&myMap[i][j]);
DP[j][i] = -1;
}
}
printf("%d\n",getResult(0,0));
return 0;
}
실수
큰 실수는 없었지만 DP를 섞은 재귀를 설계하는 데에 시간이 꽤 걸렸다.
'SW > 알고리즘 문제풀이' 카테고리의 다른 글
BJ9251 LCS (0) | 2020.03.17 |
---|---|
BJ2565 전깃줄 (0) | 2020.03.17 |
BJ9461 파도반 수열 (0) | 2020.03.12 |
BJ2206 벽 부수고 이동하기 (0) | 2020.03.09 |
SWEA1249 보급로 (0) | 2020.03.09 |
Comment