链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意:每块的宽度都是1,输入高度,求出最大的一块矩形面积是多少
我的思路是对于每块矩形,制约高度的都是最矮的一块矩形,那么初步思路是通过对每一块矩形的左右进行搜索,(左边+右边的宽度)*这块矩形的高度,就是这块矩形所能得到的最大面积,然后再判断出所有矩形中面积最大的即可,但是这样的做法是很慢的,进行一下优化也许可以,所以我分两步来分别搜索左右边界,如果左边的那块高度>=当前高度的话,就可以直接加上那块的左边界,然后从那块的左边界继续向左搜索,这样就不会产生重复的搜索过程
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
const int maxn = 100001;
__int64 h[maxn], l[maxn], r[maxn];
int main()
{
// freopen("D://input.txt", "r", stdin);
// freopen("D://output.txt", "w", stdout);
int n;
while (scanf("%d", &n) != EOF&&n)
{
int i, j;
for (i = 1; i <= n; i++)
{
scanf("%I64d", &h[i]);
l[i] = r[i] = 1;//初始化左右边界的长度为1
}
for (i = 2; i <= n; i++)
{
j = i;
while (j > 1 && h[j - 1] >= h[i])//从当前块的左边开始搜索,然后一直搜索左边块的左边界
{
l[i] += l[j - 1];
j = i - l[i] + 1;
}
}
__int64 ans = h[n] * l[n];//最右边的矩形的面积
for (i = n - 1; i >= 1; i--)
{
j = i;
while (j < n&&h[j + 1] >= h[i])//同样的思路,从右边向左扩展,搜索每块的右边界,然后再计算面积
{
r[i] += r[j + 1];
j = i + r[i] - 1;
}
ans = max(ans, h[i] * (l[i] + r[i] - 1));//左右边界初始化都为1,所以要去掉重复的中点
}
printf("%I64d\n", ans);
}
// printf(".6lf\n",(double)clock()/CLOCKS_PER_SEC);
return 0;
}