article thumbnail image
Published 2021. 11. 13. 16:31

문제 설명

문제 링크

http://icpc.me/2296

 

2296번: 건물짓기

첫째 줄에 건물의 개수를 나타내는 자연수 N(1 ≤ N ≤ 1,000)이 주어진다. 다음 N개의 줄에는 건물을 지을 x, y(1 ≤ x, y ≤ 1,000,000,000) 좌표와 그 건물을 지었을 때의 이익 c(1 ≤ c ≤ 50,000)가 주어진

www.acmicpc.net

풀이

dp로 풀 수 있다.

dp[i][0] = i번째까지 1,3 사분면을 사용하여 최댓값, dp[i][1] = i번째까지 2, 4 사분면을 사용하여 최댓값

위의 정의대로 구현하면 된다. 

코드

#include <iostream>
#include <algorithm>

using namespace std;

struct T { int x, y, c; };
vector<T> v;
int dp[1003][2];

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int n; cin >> n;
    for (int i = 0; i < n; i++) {
        int x, y, c; cin >> x >> y >> c;
        v.push_back({x, y, c});
    }

    sort(v.begin(), v.end(), [](T &a, T &b) { return a.x < b.x; });
    int ret = 0;
    for (int i = 0; i < n; i++) dp[i][0] = dp[i][1] = v[i].c;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (v[j].y < v[i].y) dp[i][0] = max(dp[i][0], dp[j][0] + v[i].c);
            if (v[j].y > v[i].y) dp[i][1] = max(dp[i][1], dp[j][1] + v[i].c);
        }
        ret = max({ret, dp[i][0], dp[i][1]});
    }
    printf("%d", ret);
}

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

백준[11375] 열혈강호  (0) 2021.11.13
백준[2188] 축사 배정  (0) 2021.11.13
백준[1011] Fly me to the Alpha Centauri  (0) 2021.11.12
백준[2631] 줄세우기  (0) 2021.11.12
백준[16946] 벽 부수고 이동하기 4  (0) 2021.11.12
복사했습니다!