POJ 3494 Largest Submatrix of All 1’s(最大子图形)

 

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

 

【题目大意】

  在01矩阵中求最大全1子矩形

 

【题解】

  在处理每个点的时候,继承上一个点等高度下的左右最大扩展,
  计算在该层的左右最大扩展,然后对于每个点更新答案即可。

 

【代码】

#include <cstdio>
#include <cstring>
using namespace std;
const int N=2010;
int i,j,n,m,ans,l[N],r[N],h[N],lmax,rmax,a[N][N];
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<=m;i++)l[i]=1,r[i]=m;
        for(int i=1;i<=n;i++){
            for(lmax=j=1;j<=m;j++)if(a[i][j]){
                h[j]++;
                if(lmax>l[j])l[j]=lmax;
            }else h[j]=0,l[j]=1,r[j]=m,lmax=j+1;
            for(rmax=j=m;j;j--)if(a[i][j]){
                if(rmax<r[j])r[j]=rmax;
                if((r[j]-l[j]+1)*h[j]>ans)ans=(r[j]-l[j]+1)*h[j];
            }else rmax=j-1;
        }printf("%d\n",ans);
    }return 0;
}
posted @ 2017-04-11 20:00  forever97  阅读(232)  评论(0编辑  收藏  举报