本文共 1462 字,大约阅读时间需要 4 分钟。
描述
在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多
输入
单组数据第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开
输出
输出仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数
样例输入
5 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0
样例输出
9
#includeusing namespace std;int f[2001][2001];int h[2001],l[2001],r[2001];int n,i,j;int main(){ scanf("%d",&n); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { scanf("%d",&f[i][j]); } } int ma=0; for(i=1;i<=n;i++)//一行一行处理,h[j]存储的是到第i行时,在第j列从i行开始往上的0的个数 { for(j=1;j<=n;j++) { if(f[i][j]==0) h[j]++; else h[j]=0; } for(j=1;j<=n;j++)//l[]上一行的结果不影响这一行的 { l[j]=j;//先假设第i行的第j个元素的左边界为j; while(l[j]>1&&h[j]<=h[l[j]-1])//将左边界向左扩展,但是要保持要扩展的边界l[j]-1的高度要大于等于j的高度 l[j]=l[l[j]-1]; } for(j=n;j>=1;j--) { r[j]=j; while(r[j] <=h[r[j]+1]) r[j]=r[r[j]+1]; } for(j=1;j<=n;j++) { if(ma
转载地址:http://aseti.baihongyu.com/