
문제 링크
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 |