题目链接: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; }