【题目链接】 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 ",ans); }return 0; }