问题是,给定一个所有单元格为黑色或白色的矩阵,找到所有边界单元格为黑色的最大尺寸子矩阵(内部单元格不必是黑色的)。
目前我最多能想到一个O(N^4)
解决方案。为此,我制作了 2 个辅助表,一个是每个单元格的每一行右侧连续黑色单元格的计数,另一个是每个单元格该列中连续黑色单元格的计数。然后我这样做:
for each row (i):
for each cell (i,j):
for each window (1..n-j):
if auxrow[i,j+window]-auxrow[i,j] == window: #so, all cells in this window is black
colsleft = auxcol[i,j]
colsright = auxcol[i,j+window]
botttom_row = min(colsleft,colsright)
for bot in (row..row+mincol):
if auxrow[bot][j+window]-auxrow[bot][j] == window:
maxlen = ... #do whatever to save this sub-matrix as answer
如何改进这个解决方案?我在Topcoder看到了一些有趣的讨论,特别是 Rem( O(N^2*log N)
) 的回答,以及 Tomek 提出的后续改进,但我都无法理解这两种解决方案!有人可以提供比我更好的解决方案,或者解释这些算法吗?