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
分析: 遍历每个木块,如果计算出左边和右边第一块小于当前的值的木块,
就可求出最大面积了 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; }
相关文章推荐
- ZOJ 1985 Largest Rectangle in a Histogram(刷广告)2010辽宁省赛
- ZOJ 1985 Largest Rectangle in a Histogram 迭代... 贪心
- POJ2559 HDU1506 ZOJ1985 Largest Rectangle in a Histogram【堆栈+水题】
- ZOJ1985 POJ2259 HDU1506 Largest Rectangle in a Histogram
- ZOJ 1985: Largest Rectangle in a Histogram
- zoj 1985 - Largest Rectangle in a Histogram
- ZOJ 1985 Largest Rectangle in a Histogram
- hdu1506—Largest Rectangle in a Histogram(dp+单调栈)
- 每日一dp(1)——Largest Rectangle in a Histogram(poj 2559)使用单调队列优化
- HDU 1056 Largest Rectangle in a Histogram(dp)(求最大的矩形面积)
- hdu 1506 Largest Rectangle in a Histogram ((dp求最大子矩阵))
- hdu1506 Largest Rectangle in a Histogram (DP)
- POJ 2559 Largest Rectangle in a Histogram (单调栈或者dp)
- HDU 1506 Largest Rectangle in a Histogram (dp)
- HDU1506 ( Largest Rectangle in a Histogram ) [dp]
- [HDU 1506 Largest Rectangle in a Histogram] ...类dp?...
- Largest Rectangle in a Histogram(DP)
- HDU 1506 Largest Rectangle in a Histogram(DP)
- hdu - 1506 - Largest Rectangle in a Histogram(dp / 单调栈)
- HDU-1506 Largest Rectangle in a Histogram (线性dp 维护前后边界)