全等高的柱子
运行下面这段程序:
本节模型:largest_rect 用单调栈求柱状图最大矩形,末尾放一根高 0 的哨兵柱子。
#include <algorithm>
#include <deque>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
long long largest_rect(vector<int> h) {
// 柱状图最大矩形面积
h.push_back(0); // 哨兵:最后把栈里剩下的柱子全部结算
vector<int> st; // 单调栈:下标,对应的高度从底到顶递增
long long best = 0;
for (int i = 0; i < (int)h.size(); i++) {
while (!st.empty() && h[st.back()] >= h[i]) {
long long ht = h[st.back()];
st.pop_back();
long long w = st.empty() ? i : i - st.back() - 1;
best = max(best, ht * w);
}
st.push_back(i);
}
return best;
}
int main() {
cout << largest_rect({3, 3, 3, 3}) << endl;
}
(本题用 g++ -std=c++17 -O0 编译。)
全部评论