全为 1 的最大尺寸平方子矩阵 [重复]
Posted
技术标签:
【中文标题】全为 1 的最大尺寸平方子矩阵 [重复]【英文标题】:Maximum size square sub-matrix with all 1s [duplicate] 【发布时间】:2013-07-21 07:19:29 【问题描述】:给定一个二进制矩阵,我找到了所有1
s 的最大平方子矩阵。
例如,考虑下面的二进制矩阵:
0 1 1 0 1
1 1 0 1 0
0 1 1 1 0
1 1 1 1 0
1 1 1 1 1
0 0 0 0 0
所有设置位的最大平方子矩阵是
1 1 1
1 1 1
1 1 1
我在网上搜索了解决方案,并找到了构造辅助矩阵的关系:
If M[i][j] is 1 then
S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
Else /*If M[i][j] is 0*/
S[i][j] = 0
M[][]
是原始矩阵,s[][]
是辅助矩阵?
这种关系意味着什么?
它有什么帮助。
【问题讨论】:
这是两年多前在此博客上提出的问题的副本:tech-queries.blogspot.com/search/label/Dynamic%20programming。 【参考方案1】:您可以在线性时间内做到这一点。
声明:我可以在线性时间内构建一个数据结构,让我可以在恒定时间内检查任意矩形是否全为 1。
证明:部分和;取S[i][j]
为(i, j)
上方和左侧1 的总数。在(a,b)
和(c,d)
之间的矩形中,如果(a,b)
在(c,d)
的上方和左侧,则为S[c][d] + S[a][b] - S[a][d] - S[b][c]
。
现在是对数组的简单扫描:
size = 1;
For i = 0 to m-size
For j = 0 to n-size
If S[i+size][j+size] - S[i][j+size] - S[i+size][j] + S[i][j] == size*size
size++; j--; continue;
最后,size
比最大的 1-full square 大一。
【讨论】:
时间是如何线性的?不会是 O(n^2) 吗? @WasimThabraze:“线性”表示“输入大小呈线性”。对于 n*n 网格,输入有 n^2 个元素。【参考方案2】:这是一个经典的动态规划问题。而且你还没有提到整个算法如下:
要构造辅助数组,我们必须执行以下操作:
首先将第一行第一列从M[][]复制到S[][]
对于您提到的其余条目,请执行以下操作:
If M[i][j] is 1 then
S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + 1
Else /*If M[i][j] is 0*/
S[i][j] = 0
在S[][]中找到最大的入口,并用它来构造最大尺寸的方形子矩阵
这种关系意味着什么?
要找到最大平方,我们需要找到1s在不同方向上的最小延伸,并在其上加1,形成当前情况下平方结束的长度。
所以对于您的情况 s[][] 将是:
0 1 1 0 1
1 1 0 1 0
0 1 1 1 0
1 1 2 2 0
1 2 2 3 1
0 0 0 0 0
如果我们只取其中的最小值,即S[i][j-1], S[i-1][j]
,它会处理左上角方向。但是,我们还需要确保透视正方形的左上角有 1。
S[i-1][j-1],根据定义,在位置 i-1,j-1 处包含一个最大正方形,其左上角设置了我们可以向上和向左的上限。所以,我们也需要考虑这一点。
希望这会有所帮助!
【讨论】:
...为了找到 M 的最大全 1 平方子矩阵,在 S 中找到最大条目,例如S[i][j]。此条目表示大小为 S[i][j] 的 M 的最大全 1 方子矩阵的右下角。【参考方案3】:您可以构建一个额外的递归函数,该函数将当前行和列作为参数,并从中查找任意大小的正方形。
从您的其他函数中,在额外函数返回一个值后,您必须进行 2 次调用: 一个来自 (row,col+1),另一个来自 (row+1,col)。
这是回溯用法,我们检查所有选项。
【讨论】:
以上是关于全为 1 的最大尺寸平方子矩阵 [重复]的主要内容,如果未能解决你的问题,请参考以下文章