밑면이 정사각형인 직육면체 벽돌들을 사용하여 탑을 쌓고자 한다. 탑은 벽돌을 한 개씩 아래에서 위로 쌓으면서 만들어 간다. 아래의 조건을 만족하면서 가장 높은 탑을 쌓을 수 있는 프로그램을 작성하시오.
높이
이지만 비교해야 하는 변위는 넓이
와 무게
이므로 변수가 많아서 어렵게 느껴지는 문제다.무게
또는 넓이
중 어느 한 변수에 대해 정렬시킨 뒤 다른 변수를 통해 조건 세우는 것이다. 무게
에 대해 정렬시킨 뒤 넓이
에 대해 조건을 세웠다.#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef struct Stat {
int area, height, weight, index;
}Stat;
int n;
int dp[101], arr[101], counts[101];
vector<Stat> vec(101);
void print(int n) {
if (n != 0) {
print(arr[n]);
cout << vec[n].index << '\n';
}
}
void q2655() {
int maxHeight = 0, maxIdx = 0;
for (int i = 1; i <= n; ++i) {
for (int j = i - 1; j >= 0; --j) {
if (vec[i].area > vec[j].area) {
// 만일 현재 기록된 높이보다 더 높은 탑을 쌓을 수 있다면 갱신해준다.
if (dp[i] < dp[j] + vec[i].height) {
dp[i] = dp[j] + vec[i].height; // 해당 높이를 기록한다.
arr[i] = j; // i번째 위에 j번 탑이 있음.
counts[i] = counts[j] + 1; // i번째가 제일 밑에 있을 때 쌓을 수 있는 개수
}
}
}
if (maxHeight < dp[i]) { // 최대 높이를 갱신할 수 있다면 갱신한다.
maxHeight = dp[i];
maxIdx = i;
}
}
cout << counts[maxIdx] << '\n';
print(maxIdx);
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> vec[i].area >> vec[i].height >> vec[i].weight;
vec[i].index = i;
}
sort(begin(vec) + 1, begin(vec) + n + 1, [](const Stat& lhs, const Stat& rhs) {
return (lhs.weight < rhs.weight);
}); // 무게에 대해 오름차순 정렬한다.
q2655();
}