51nod1158 最大子矩形 单调栈应用

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod1158 最大子矩形 单调栈应用相关的知识,希望对你有一定的参考价值。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int mp[600][600],m,n,ans;
void work(int i){//以第i行为底的矩阵 
    int stk[600],w[600]={},h[600]={},top=0;//高度栈,左宽栈 
    memset(stk,-1,sizeof stk);
    for(int j=1;j<=m;j++)h[j]=mp[i][j];
    for(int j=1;j<=m;j++){
        if(h[j]>stk[top])
            stk[++top]=h[j],w[top]=1;
        else { 
            int cnt=0;
            while(top>=1 && stk[top]>=h[j]){
                ans=max(ans,stk[top]*(w[top]+cnt));
                cnt+=w[top--]; 
            }
            stk[++top]=h[j];
            w[top]=cnt+1;
        }
    }
}
int main(){
    while(scanf("%d%d",&n,&m)==2){
        memset(mp,0,sizeof mp);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&mp[i][j]);
                
        m++;//在最右边添一个全0列 
        for(int j=1;j<=m;j++)
            for(int i=1;i<=n;i++)
                if(mp[i][j]==1)mp[i][j]=mp[i-1][j]+1;
        
        ans=0;
        for(int i=1;i<=n;i++)
            work(i);
        printf("%d
",ans);
    }
} 

 

以上是关于51nod1158 最大子矩形 单调栈应用的主要内容,如果未能解决你的问题,请参考以下文章

HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)

51nod1158 单调栈 个人的想法以及分析

51nod 1158 全是1的最大子矩阵

51nod 1102 面积最大的矩形 (单调栈)

51nod 1102 面积最大的矩形(单调栈)

51nod 1102 面积最大的矩形 && 新疆大学OJ 1387: B.HUAWEI's billboard 单调栈+拼凑段(o(n) 或 o(nlog(n))