poj3494Largest Submatrix of All 1’s(最大全1子矩阵)

题目链接:http://poj.org/problem?id=3494

题目大意:

出1个M*N的矩阵M1,里面的元素只有0或1,找出M1的一个子矩阵M2,M2中的元素只有1,并且M2的面积是最大的。输出M2的面积
 
解题思路:
枚举以当前位置为真实高度,查找它的左右边界,更新答案。
 
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int maxn=2005;
int n,m;
int a[maxn][maxn],h[maxn],l[maxn],r[maxn],ans;

int main(){
    while(~scanf("%d%d",&n,&m)){
        ans=0;
        memset(h,0,sizeof(h));
        for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        scanf("%d",&a[i][j]);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(a[i][j]==1) h[j]++;
                else h[j]=0;
            }
            h[0]=h[m+1]=-1;
            for(int j=1;j<=m;j++){
                int pos=j;
                while(h[pos-1]>=h[j]) pos=l[pos-1];
                l[j]=pos;
            }
            for(int j=m;j>=1;j--){
                int pos=j;
                while(h[pos+1]>=h[j]) pos=r[pos+1];
                r[j]=pos;
            }
            for(int j=1;j<=m;j++){
                ans=max(ans,h[j]*(r[j]-l[j]+1));
            }
        }
        printf("%d
",ans);
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/zjl192628928/p/11438107.html