程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU OJ 1506 Largest Rectangle in a Histogram 和 NYOJ 258 最大長方

HDU OJ 1506 Largest Rectangle in a Histogram 和 NYOJ 258 最大長方

編輯:C++入門知識

思路:單調隊列,開 兩個數組 stack [ ] 和 len  [ ]  stack [ ] 存 輸入的 長 len [  ] 存寬。stack 裡面 按 單增 存,遇到 比 stack [ top ] 小的 數據 就要 講 頂部元素刪除,直到 刪後 頂部可以存 為止,在刪之前 要 看是否 可以更新 ans ((l+len[ top ])*stack[ top ] 與 當前 ans 取最大值給 ans),記下 此時 len [ top ] 的值,給  l (l+=len[ top ]),新進入的 len 值 即為 l +1 , 具體看代碼理解。
AC代碼:
[cpp] 
 /*此代碼為 nyoj ac 代碼,若在 hdu oj 要講 long long 改為 __int64(對應輸出格式也要改下),hdu oj 不支持 long long*/ 
#include<stdio.h> 
#include<string.h> 
#define max(a,b) a>b?a:b  
int stack[100010],len[100010]; 
int main() 

    int a,b,n,h; 
    while(scanf("%d",&n)&&n) 
    { 
        long long top=-1,ans=0; 
        for(a=0;a<=n;a++) 
        { 
            if(a<n) 
                scanf("%d",&h); 
            else 
                h=-1; 
            if(top<0||stack[top]<h) 
            { 
                stack[++top]=h; 
                len[top]=1; 
            } 
            else 
            { 
                int l=0; 
                while(stack[top]>=h&&top>=0) 
                { 
                    ans= max(ans,(long long)(len[top]+l)*stack[top]); 
                    l+= len[top--]; 
                } 
                if(h>0) 
                { 
                    stack[++top]=h; 
                    len[top]=1+l; 
                } 
            } 
        } 
        printf("%lld\n",ans); 
    } 
}         
作者:PIAOYI0208

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved