如何在一个方阵中找到最大全一子方阵?
一个边长为N(N<=1000)的方阵,其元素为随机的1或0,如何快速找出其中【边长最大的】【元素全为1的】子方阵边长?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
一个边长为N(N<=1000)的方阵,其元素为随机的1或0,如何快速找出其中【边长最大的】【元素全为1的】子方阵边长?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
这个方法复杂度不是最优的,不过好想。
首先预处理后我们可以 O(1) 求出每个子矩(不一定方)阵的 1 个数。
然后枚举方阵左上角,二分子方阵边长判断这个子方阵是不是全 1 的。
复杂度 O(n^2 log n), 1000 可过。
啊还是写写代码:
开两个数组heng[i][j],shu[i][j],表示(i,j)这个格子横着向左有heng[i][j]个连续的1(包括它本身),向上有shu[i][j]个连续的1.heng[i][j]和shu[i][j]可以在读入矩阵的时候就预处理
if(当前格子!=1){heng[i][j]=1}else{heng[i][j]=heng[i][j-1]+1}
else{heng[i][j]=0}
shu[i][j]也是同样的处理
在计算heng[i][j]&shu[i][j]的同时就能计算以(i,j)为右下角的合法矩形的最大面积了。
比如heng[i][j]=8 shu[i][j]=5,那么以(i,j)为右下角的矩形最大的可能面积不超过40,最大面积计算应该是 for(x=i; heng[x][j]>0; x--){w = min(w,heng[x][j])} ans=w*shu[i][j]