1149 RGB 거리
풀이코드
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
// 1149 RGB 거리
const int MAX = 1000;
int n;
int A[MAX + 1][3];
int cache[MAX + 1][3];
int min(int a, int b){
return a > b ? b : a;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n;
for(int i = 1; i <= n; i++){
for(int j = 0; j < 3; j++){
cin >> A[i][j];
if(i == 1) cache[i][j] = A[i][j];
}
}
for(int i = 1; i <= n; i++){
for(int j = 0; j < 3; j++){
cache[i][j] = min(cache[i - 1][ (j+1) % 3], cache[i - 1][ (j+2) % 3]) + A[i][j];
}
}
cout << min( min(cache[n][0], cache[n][1]), cache[n][2]) << '\n';
}
해설
적용한 레시피 / 방법론 + 접근법
풀이
0. 브루트 포스는 N 이 1000 이하 이므로 불가능하다. 3^1000 > 1억
1. 다이나믹 프로그래밍 + 연속성과 관련된 문제이다. (이전에 풀었던 문제들과 맥락이 비슷)
2. 3가지의 색깔이 서로 연속하면 안되는 것을 배열로써 판별해야 하므로,
cache[i][j] : 1 ~ i 번째 집까지, i 번째 집을 j색으로 칠했을 때, 비용의 최솟값을 저장하는 배열
로 정의한다.
3. 그러면,
cache[i][j] = min(cache[i - 1][ (j+1) % 3], cache[i - 1][ (j+2) % 3]) + A[i][j]
임을 도출해낼 수 있다.
아쉬웠던 부분 / 오답 원인 / 개선해야 할 점
반응형
'ps > 다이나믹 프로그래밍' 카테고리의 다른 글
[dp] 1932 정수 삼각형 (0) | 2021.09.26 |
---|---|
[연속 dp] 1309 동물원 (0) | 2021.09.26 |
[dp] 15988 1,2,3 더하기 3 (0) | 2021.09.26 |
[dp] 1912 연속합 (0) | 2021.09.25 |
[dp] LIS 4 14002 (0) | 2021.09.25 |