题目链接: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 __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;
}