码迷,mamicode.com
首页 > 其他好文 > 详细

zoj 1985 - Largest Rectangle in a Histogram

时间:2014-09-21 23:23:01      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   for   数据   2014   sp   on   

题目:给你一些不同高度的宽度为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

标签:style   blog   io   ar   for   数据   2014   sp   on   

原文地址:http://blog.csdn.net/mobius_strip/article/details/39457395

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!