在方阵中,每个单元格为黑色或白色。设计算法以找到最大白色子方块

时间:2015-04-06 08:56:37

标签: c++ c algorithm data-structures

在方阵中,每个单元格为黑色或白色。设计一种算法来找到最大白色(整个子方格是白色)子方块。

O(n ^ 2)的解决方案: 从左到右扫描每列,对于每列中的每个单元格,扫描每一行以找到最大的白色子方块。

你有更好的解决方案吗?

感谢

1 个答案:

答案 0 :(得分:0)

首先请注意,您的解决方案不是O(n^2),而是更像O(n^4),因为对于每个单元格,您需要查找最大可能大小为O(n^2)的矩阵本身,总共为O(n^4)

然而,可以在O(n^2)

中完成

首先,定义2个辅助功能(实现为矩阵):

whitesLeft(x,y) = number of adjacent white cells on the same row to the left from x,y - exclusive of x,y
whitesUp(x,y) = number of adjacent white cells on the same column up from x,y -  exclusive of x,y

现在,定义递归函数:

D(0,y) = 0     if (0,y) is black
         1     otherwise
D(x,0) = 0     if (x,0) is black
         1     otherwise
D(x,y) = 0                                                         if  x,y is black
         min{ D(x-1,y-1), whitesLeft(x,y), whitesUp(x,y) } + 1     otherwise

我们的想法是使用D(x,y)计算(x,y)中结束的最大正方形(右下角)。通过查找左侧的最小单元格,向上的单元格以及以(x-1,y-1)结尾的仅具有白色单元格的子矩阵来计算此正方形。

请注意D(x,y)可以使用O(n^2)中的D ynamic Programming进行有效计算,而计算辅助函数(矩阵)的预处理也是O(n^2)。< / p>

完成后,发帖D以查找D(x,y)的最大值(x,y)以获得结果 - 这也是O(n^2)