오늘의 알고리즘
[C++] 백준 6549 히스토그램에서 가장 큰 직사각형
하늘하늘 .
2023. 4. 17. 02:00
#include <iostream>
#include <algorithm>
#include <vector>
long long n = 0;
std::vector<long long> vec = {};
long long calculate(long long left, long long right)
{
long long mid = (left + right) / 2;
long long midArea = vec[mid];
long long height = vec[mid];
long long l = mid - 1;
long long r = mid + 1;
if (left + 1 >= right)
{
return midArea;
}
while (l > left || r < right)
{
if (l <= left || (r < right && vec[l] <= vec[r]))
{
height = std::min(vec[r++], height);
}
else
{
height = std::min(height, vec[l--]);
}
long long width = r - 1 - l;
midArea = std::max(midArea, width * height);
}
return std::max(midArea, std::max(calculate(left, mid), calculate(mid, right)));
}
int main()
{
while (true)
{
std::cin >> n;
if (n == 0)
{
break;
}
vec = std::vector<long long>(n + 2);
for (int i = 1; i <= n; ++i)
{
std::cin >> vec[i];
}
std::cout << calculate(0, n + 1) << "\n";
}
return 0;
}
중간값을 이용해서 양옆으로 분할해나가면서 푸는 문제
처음부터 이건 어떻게 푸는 거지... 이랬다
알고리즘 쉬운 것만 풀다가 다시 어려운 걸 풀라니까 정말 헷갈리더라