poj2559/hdu1506 单调栈经典题

我实在是太菜了啊啊啊啊啊

到现在连个单调栈都不会啊啊啊

写个经典题

#include<cstdio>
#include<algorithm> 
#include<cstring> 
#define ll long long
using namespace std;

 
ll dp1[100010],dp2[100010];
ll h[100010];
int main()
{
    ll n;
    while(scanf("%d",&n)!=EOF&&n){
        memset(h,0,sizeof h);
        for(ll i=1;i<=n;i++){
            scanf("%d",&h[i]);
            dp1[i]=dp2[i]=i;
        }
        dp1[0]=1;
        dp2[n+1]=n;
        h[0]=-1;
        h[n+1]=-1;
        
        for(ll i=1;i<=n;i++)
        {
            while(h[dp1[i]-1]>=h[i])
            dp1[i]=dp1[dp1[i]-1];
        }
        for(ll i=n;i>=1;i--)
        {
            while(h[dp2[i]+1]>=h[i])
            dp2[i]=dp2[dp2[i]+1];
        } 
        ll ans=-0x3f3f3f3f;
        for(ll i=1;i<=n;i++)
        {
            ans=max(ans,h[i]*(dp2[i]-dp1[i]+1));
        }
        printf("%lld\n",ans);
    }
    return 0;
}

poj3494

寻找01矩阵中的最大1矩阵

同上的方法,将图预处理即可

posted @ 2018-09-20 16:11  ASDIC减除  阅读(111)  评论(0编辑  收藏  举报