您的位置:首页 > 其它

hdu 1506 Largest Rectangle in a Histogram (最大子矩阵)

2016-07-29 10:17 405 查看
题意:容易理解...

分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1;我们从左到

右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了。

#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <cmath>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define L(i) i<<1
#define R(i) i<<1|1
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-9
#define maxn 100010
#define MOD 1000000007

long long c[maxn];
int n;
long long a[maxn],b[maxn];
int main()
{
int t;
//scanf("%d",&t);
while(scanf("%d",&n) && n)
{
for(int i = 0; i < n; i++)
scanf("%lld",&a[i]);
b[0] = 0;
for(int i = 1; i < n; i++)
{
int t = i;
while(a[t-1] >= a[i] && t > 0)
t = b[t-1];
b[i] = t;
}
c[n-1] = n-1;
for(int i = n-2; i >= 0; i--)
{
int t = i;
while(a[t+1] >= a[i] && t < n-1)
t = c[t+1];
c[i] = t;
}
long long ans = 0;
for(int i = 0; i < n; i++)
ans = max(ans,(c[i]-b[i]+1)*a[i]);
printf("%lld\n",ans);
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: