[적용한 알고리즘]

DP

[아이디어]

dp[i] : i 번째 건물까지 지었을 때 비용의 최솟값

으로 정해놓고 생각하자,

 

[생각의 흐름 / 절차] 

dp[i] = min(dp[i], dp[j - 1] + cost) 이고

cost : j ~ i 까지 기지국 비용

 

[교훈]

내용

 

<코드>

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

int main(){
    int n; scanf("%d", &n);
    vector<pair<int, int>> P(n + 1);

    for (int i = 1; i <= n; i++){
        scanf("%d %d", &P[i].first, &P[i].second);
        if (P[i].second < 0){
            P[i].second *= -1;
        }
    }

    sort(P.begin() + 1, P.end());
    vector<int> dp(n + 1, 100000000);
    dp[0] = 0;

    for (int i = 1; i <= n; i++){
        int up = 0;
        for (int j = i; j >= 1; j--){
            up = max(up, P[j].second); // 다 커버쳐야하니까
            int square = max(P[i].first - P[j].first, up * 2);
            dp[i] = min(dp[i], dp[j - 1] + square);
        }
    }

    printf("%d\n", dp[n]);
    return 0;
}

'Algorithm > BOJ' 카테고리의 다른 글

[백준] 5557번 1학년  (0) 2020.01.01
[백준] 2229번 조 짜기  (0) 2020.01.01
[백준] 10282번 해킹  (0) 2019.12.28
[백준] 6118번 숨바꼭질  (0) 2019.12.28
[백준] 1725번 히스토그램  (0) 2019.12.27

+ Recent posts