最大01矩阵(悬线法)
#include<bits/stdc++.h> using namespace std; const int maxn=1e3+5; int val[maxn][maxn],l[maxn],r[maxn],h[maxn]; int ans,lmax,rmax,n,m,j; void solve(){ ans=0; 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(val[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>=1;j--)if(val[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; } } int main(){ while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) cin>>val[i][j]; solve(); printf("%d\n",ans); } return 0; }