poj 2559 Largest Rectangle in a Histogram

poj 2559 Largest Rectangle in a Histogram
http://acm.pku.edu.cn/JudgeOnline/problem?id=2559
dp题

题目意思就是给你一个柱状图。相邻的几个柱子包含一个矩形。问这个矩形

面积最大的可能是多少?柱状图范围是1-100000;很大所以O(n^2)的算法是行不通

的!

假设当前考虑的柱形为i,那么怎么求出以他的高度为大矩形高度的大矩形的面积S
呢?先求出连续的一段内,他左边的,高度比他大的柱形能到达的最左端left,以及
他右边的高度比他大的柱形所能到达的最右端right,那么S=(right-left+1)*height[i];
这样时间复杂度为O(n);所iguanjian是求出每个矩形的left,right!!

Source Code

Problem: 2559
User: lovecanon
Memory: 2552K
Time: 188MS
Language: C++
Result: Accepted

#include < stdio.h >
__int64 height[
100001 ],right[ 100001 ],left[ 100001 ],max,tmp,i,n;
int  main(){
    
while (scanf( " %I64d " , & n),n != 0 ){
        
for (i = 1 ;i <= n;i ++ ) {
            scanf(
" %I64d " , & height[i]);
            left[i]
= right[i] = i;
        }
        height[
0 ] = height[n + 1 ] =- 1 ;
        
for (i = 1 ;i <= n;i ++ )
            
while (height[i] <= height[left[i] - 1 ]) left[i] = left[left[i] - 1 ];//循环求left
        
for (i = n;i >= 1 ;i -- )
            
while (height[i] <= height[right[i] + 1 ]) right[i] = right[right[i] + 1 ];//循环求right
        
for (max = 0 ,i = 1 ;i <= n;i ++ )
            
if ((tmp = (right[i] - left[i] + 1 ) * height[i]) > max) max = tmp;//找最大值
        printf(
" %I64d\n " ,max);
    }
    
return   0 ;
}

还有就是我刚开始用的long long +scanf("%lld")读数的,一直RE!改成__int64就AC了!

你可能感兴趣的:(poj 2559 Largest Rectangle in a Histogram)