首页 > 代码库 > zoj 1985 - Largest Rectangle in a Histogram
zoj 1985 - Largest Rectangle in a Histogram
题目:给你一些不同高度的宽度为1的木板,问能截取最大矩形面积。
分析:dp,单调队列。关键在于找到每个高度的最大连续长度,最大面积了 O(N*max(R - L));
如果暴力的话,则代价为O(N),则总代价为O(N*N)无法处理100000数据量;
但是可用单调队列,做预处理 用O(N)时间计算出所有点的边界,此时时间复杂度为 O(N);
每个元素从单调队列中出去的时间就是找到第一个不符合条件的点的时候,两边用0为边界值。
说明:很多人N^2过了,数据可能有点弱。(2011-09-19 01:37)
#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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。