[ 백준 1149 - RGB 거리 ]
문제 분석
- DP
시간 복잡도
구현
테이블 정의
D[i][1] == i번째까지 색칠을 마쳤고 i번째 집을 R로 색칠 했을 경우 D[i][2] == i번째까지 색칠을 마쳤고 i번째 집을 G로 색칠 했을 경우 D[i][3] == i번째까지 색칠을 마쳤고 i번째 집을 B로 색칠 했을 경우
점화식 정의
D[i][1] = min(D[i-1][2], D[i-1][3]) + score[i][1]; D[i][2] = min(D[i-1][1], D[i-1][3]) + score[i][2]; D[i][3] = min(D[i-1][1], D[i-1][2]) + score[i][3];
- score[i][RGB_cost] = i번째 집을 칠할 때의 비용 ( 문제의 입력 값 )
초기값의 정의
D[1][1] = score[1][1] D[1][2] = score[1][2] D[1][3] = score[1][3]
헤맸던 부분
헤맸던 곳은 딱히 없다.
얻은 것
DP 유형 학습
전체 코드 [ 내 코드 ]
#include <iostream>
using namespace std;
int board[1002][5]; // 1-indexed
int score[1002][5]; // 1-indexed
void init(){
ios::sync_with_stdio(0);
cin.tie(0);
}
int N;
void get_input(){
cin >> N;
for(int i = 1 ; i <= N; i++) {
cin >> board[i][1];
cin >> board[i][2];
cin >> board[i][3];
}
}
int main(void){
init();
get_input();
score[1][1] = board[1][1];
score[1][2] = board[1][2];
score[1][3] = board[1][3];
for(int i = 2 ; i <= N; i++){
score[i][1] = min(score[i-1][2], score[i-1][3]) + board[i][1];
// R
score[i][2] = min(score[i-1][1], score[i-1][3]) + board[i][2];
// G
score[i][3] = min(score[i-1][1], score[i-1][2]) + board[i][3];
// B
}
int ans = score[N][1];
for(int i = 2; i <= 3; i++){
ans = min(ans, score[N][i]);
}
cout << ans << "\n";
return 0;
}
느낀점
DP는 유형 양치기...?
참조
바킹독님의 유튜브 강의
유튜브 강의 영상
정리를 상당히 깔끔하게 잘 해놓으셔서 이해하기 쉽게 되어있다.
Author And Source
이 문제에 관하여([ 백준 1149 - RGB 거리 ]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@eden6187/백준-1149-RGB-거리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)