HDU-Largest Rectangle in a Histogram-1506 单调栈
生活随笔
收集整理的這篇文章主要介紹了
HDU-Largest Rectangle in a Histogram-1506 单调栈
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
連接:http://acm.hdu.edu.cn/showproblem.php?pid=1506
題意:給一個(gè)柱狀圖,每個(gè)小矩形寬為1,求這個(gè)柱狀圖最大子矩形的面積
思路:用單調(diào)棧求出每個(gè)小矩形所能組成最大矩形的左寬和有寬,分別存在l[i] , r[i]數(shù)組里,然后 ans = max( h[i] * ( r[i] - l[i] )
注意:int * int 結(jié)果可能超過(guò)2^32
代碼:
#include <iostream> #include <algorithm> #define ll long long #define maxn 100000+100 //#define scanf scanf_susing namespace std;int n; int h[maxn]; int l[maxn], r[maxn]; int st[maxn];void solve() {int t = 0;for (int i = 0; i < n; i++){while (t > 0 && h[st[t - 1]] >= h[i]) t--;l[i] = t == 0 ? 0 : (st[t - 1] + 1);st[t++] = i;}t = 0;for (int i = n-1; i >= 0; i--){while (t > 0 && h[st[t - 1]] >= h[i]) t--;r[i] = t == 0 ? n : st[t - 1];st[t++] = i;}ll res = 0;for (int i = 0; i < n; i++){res = max(res, 1ll*h[i] * (r[i] - l[i]));}printf("%lld\n", res); }int main() {while (scanf("%d", &n) && n) {for (int i = 0; i < n; i++){scanf("%d", &h[i]);}solve();}return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/the-way-of-cas/p/9594573.html
總結(jié)
以上是生活随笔為你收集整理的HDU-Largest Rectangle in a Histogram-1506 单调栈的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java EE业务处理流程与XML的引入
- 下一篇: 金兄的境界:我的名字搜索终于出来了。重要