HDOJ 1506 Largest Rectangle in a Histogram

来源:互联网 发布:淘宝那家鞋子好 编辑:程序博客网 时间:2024/06/09 15:52

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506

题意:如图一样,找出其中最大能形成的矩形


这题我们可以用贪心去解决,贪心的策略就是找到每一个点它往左边延伸比第一个它a[i]小的点l,和往右边延伸第一个比它大的点r,那么对于每一个点,能形成的最大的矩形面积就是(l-r+1)*a[i],这样我们就遍历每一个点就能找到最大值。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define LL __int64using namespace std;const int maxn = 100000+5;LL a[maxn],l[maxn],r[maxn];int main(){int n;while(scanf("%d",&n) && n){for(int i=1; i<=n; i++)scanf("%I64d",&a[i]);l[1] = 1,r[n] = n;for(int i=2; i<=n; i++){int tmp = i;while(tmp>1 && a[i]<=a[tmp-1])tmp = l[tmp-1];l[i] = tmp;}for(int i=n-1; i>=1; i--){int tmp = i;while(tmp<n && a[i]<=a[tmp+1])tmp = r[tmp+1];r[i] = tmp;}LL Max = 0;for(int i=1; i<=n; i++)Max = max((r[i]-l[i]+1)*a[i], Max);printf("%I64d\n",Max);}return 0;}


0 0
原创粉丝点击