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

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

HDOJ 1506 Largest Rectangle in a Histogram_i++

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


#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define LL __int64
using 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;
}