Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- vuejs
- cos pro
- issue
- Algorithm
- 파이썬
- 안드로이드스튜디오
- 백준
- DFS
- 코딩테스트
- DART
- django
- Vue
- 분할정복
- 개발
- android
- 안드로이드
- 알고리즘
- cos
- AndroidStudio
- cos pro 1급
- 동적계획법
- C++
- DFS와BFS
- BAEKJOON
- 동적계획법과최단거리역추적
- codingtest
- 코드품앗이
- Python
- Flutter
- 코테
Archives
- Today
- Total
Development Artist
[Baekjoon, C++] 6549번: 히스토그램에서 가장 큰 직사각형 본문
728x90
반응형
도입
백준 단계별 풀기에서 분할정복 아홉 번째 문제이다.
(참고로 1725번 문제와 결을 같이한다. 1725번의 경우는 스택을 이용해 푼다.)
풀이
1. 어떤 히스토그램에서 가장 왼쪽과 가장 오른쪽을 변으로 하는 가장 큰 직사각형의 높이는? 그 히스토그램에서 가장 높이가 낮은 막대를 높이로 하는 직사각형이 가장 크다.
2. 그렇다면 높이가 가장 낮은 막대를 히스토그램의 왼쪽(0번째)부터 m번째 막대라고 한다면, 우리는 m의 왼쪽과 m의 오른쪽으로 나눌 수 있다. 그렇다면 하나의 히스토그램에서 임의의 n개의 히스토그램으로 분할할 수 있다.
코드
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
vector<LL> h; // height vector
LL calLargestSquare(int left, int right) {
if (left == right) return h[left]; // n = 1 or end Of Div&coq
int mid = (left + right) / 2;
LL ret = max(calLargestSquare(left, mid), calLargestSquare(mid + 1, right));
LL lo = mid; // 젤 낮은 높이에서 좌측 (젤 낮은 높이 포함)
LL hi = mid + 1; // 젤 낮은 높이에서 우측
LL height = min(h[lo], h[hi]);
ret = max(ret, height * 2);
while (left < lo || hi < right) {
if (hi < right && (lo == left || h[lo - 1] < h[hi + 1])) {
++hi;
height = min(height, h[hi]);
}
else {
--lo;
height = min(height, h[lo]);
}
ret = max(ret, height * (hi - lo + 1));
}
return ret;
}
int main() {
int n, tempH;
cin >> n;
while (n) {
h.clear();
for (int i = 0; i < n; i++) {
cin >> tempH;
h.push_back(tempH);
}
cout << calLargestSquare(0, n - 1) << endl;
cin >> n;
}
}
마무리
처음 문제를 봤을 때, 감이 않왔다. 그래서 백준님의 풀이와, 여러 블로그들을 읽어보고 감을 잡았다. 점점 알아가는 과정에서 정말 재밋는 문제라는 것을 알았다.
728x90
반응형
'Algorithm > Baekjoon' 카테고리의 다른 글
[Baekjoon, Python] 10816번: 숫자 카드 2 (0) | 2021.02.04 |
---|---|
[Baekjoon, Python] 1920번: 수 찾기 (0) | 2021.02.03 |
[Baekjoon, C++] 11444번: 피보나치 수 6 (0) | 2021.01.29 |
[Baekjoon, C++] 10830번: 행렬 제곱 (0) | 2021.01.28 |
[Baekjoon, C++] 2740번: 행렬 곱셈 (0) | 2021.01.27 |
Comments