[BOJ]1149 RGB거리

DP 예제

Posted by kyoungIn on February 19, 2019

RGB거리

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
0.5 초 (언어별 추가 시간 없음) 128 MB 28508 12672 9483 46.252%

문제

RGB거리에 사는 사람들은 집을 빨강, 초록, 파랑중에 하나로 칠하려고 한다. 또한, 그들은 모든 이웃은 같은 색으로 칠할 수 없다는 규칙도 정했다. 집 i의 이웃은 집 i-1과 집 i+1이다.

각 집을 빨강으로 칠할 때 드는 비용, 초록으로 칠할 때 드는 비용, 파랑으로 드는 비용이 주어질 때, 모든 집을 칠할 때 드는 비용의 최솟값을 구하는 프로그램을 작성하시오.

입력

첫째 줄에 집의 수 N이 주어진다. N은 1,000보다 작거나 같다. 둘째 줄부터 N개의 줄에 각 집을 빨강으로 칠할 때, 초록으로 칠할 때, 파랑으로 칠할 때 드는 비용이 주어진다. 비용은 1,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 모든 집을 칠할 때 드는 비용의 최솟값을 출력한다.

예제 입력 1

1
2
3
4
3
26 40 83
49 60 57
13 89 99

예제 출력 1

1
96

풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <vector>
#define IOFAST() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);

using namespace std;
int main(){
    IOFAST();
    int i,j,n;
    cin >> n;
    vector<vector<int>> v,dp;
    v.resize(n); dp.resize(n);
    for(i=0;i<n;i++){
        for(j=0;j<3;j++){
            int temp;
            cin >> temp;
            v[i].push_back(temp);
            dp[i].push_back(0);
        }
    }
    dp[0][0] =v[0][0];  dp[0][1]=v[0][1];  dp[0][2]=v[0][2];
    
    for(i=1;i<n;i++){
        dp[i][0]=min(dp[i-1][1],dp[i-1][2])+v[i][0];
        dp[i][1]=min(dp[i-1][0],dp[i-1][2])+v[i][1];
        dp[i][2]=min(dp[i-1][0],dp[i-1][1])+v[i][2];
    }
    int minNum= min(min(dp[n-1][0],dp[n-1][1]),dp[n-1][2]);
    cout << minNum << '\n';
}