Largest Rectangle in a Histogram
A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles:
7 2 1 4 5 1 3 3 4 1000 1000 1000 1000 0
8 4000
题意 :找最大长方形,显然暴力肯定超时,这个时候应该用记忆化的方法。h 数组存高度 ,l数组存连续比当前高度高的最左边的位置 r数组存连续比当前高度高的最右边的位置
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<queue>;
#include<stack>;
#include <iomanip>;
#define INF 0x3f3f3f3f
using namespace std;
long long h[110000];
int l[110000];
int r[110000];
int main()
{
int n;
int e,i;
while(~scanf("%d",&n)&&n)
{
for( i=1;i<=n;i++)
{
scanf("%lld",&h[i]);
}
for(i=1;i<=n;i++)
{
l[i]=i; //初始化
r[i]=i;
}
for( i=1;i<=n;i++)
{
e=i-1;
while(h[i]<=h[e])
{
l[i]=l[l[e]];
e=l[i]-1;
}
}
for( i=n;i>=1;i--) //如果还是1到n会超时
{
e=i+1;
while(h[i]<=h[e])
{
r[i]=r[r[e]];
e=r[i]+1;
}
}
long long ans=0;
for( i=1;i<=n;i++)
{
if(h[i]*(r[i]-l[i]+1)>ans)
ans=h[i]*(r[i]-l[i]+1);
}
printf("%lld\n",ans);
}
}
因篇幅问题不能全部显示,请点此查看更多更全内容