您的位置:首页 > 其它

zoj1985 Largest Rectangle in a Histogram(DP)

2011-08-17 13:27 393 查看
/*
分析: 遍历每个木块,如果计算出左边和右边第一块小于当前的值的木块,
就可求出最大面积了 O(N*max(find(L),find(R)))
如果暴力的话,则find 为O(N) ,则O(N*N) 无法处理100000数据量。
但是可用单调队列,做预处理 用O(N) 时间计算出所有点的边界。
此时时间复杂度为 O(N)。
每个元素从单调队列中出去的时间就是找到第一个不符合条件的点的时候,
两边用0标记作为边界值。
*/

View Code

#include <stdio.h>
#include <stdlib.h>

long long stick[ 100005 ];
int     MUQ[ 100005 ];
int  L[ 100005 ],R[ 100005 ];

int main()
{
int n;
while ( scanf("%d",&n) && n ) {
for ( int i = 1 ; i <= n ; ++ i )
scanf("%lld",&stick[ i ]);
stick[ 0 ] = -1; stick[ n+1 ] = -1;

/* 单调队列预处理,求出每个stick的右边的第一个小于他高度的stick位置 */
int tail = 0;
MUQ[ 0 ] = 0;
for ( int i = 1 ; i <= n+1 ; ++ i ) {
while ( tail >= 0 && stick[ MUQ[ tail ] ] > stick[ i ] )
R[ MUQ[ tail -- ] ] = i;
MUQ[ ++ tail ] = i;
}

/* 单调队列预处理,求出每个stick的左边的第一个小于他高度的stick位置 */
tail = 0;
MUQ[ 0 ] = n+1;
for ( int i = n ; i >= 0 ; -- i ) {
while ( tail >= 0 && stick[ MUQ[ tail ] ] > stick[ i ] )
L[ MUQ[ tail -- ] ] = i;
MUQ[ ++ tail ] = i;
}

long long Max = 0,Temp = 0;
for ( int i = 1 ; i <= n ; ++ i ) {
Temp = stick[ i ]*(R[ i ]-L[ i ]-1);
if ( Max < Temp )
Max = Temp;
}
printf("%lld\n",Max);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: