【问题标题】:In a square matrix, where each cell is black or white. Design an algorithm to find the max white sub-square [closed]在方阵中,每个单元格都是黑色或白色。设计一种算法来找到最大的白色子正方形[关闭]
【发布时间】:2015-04-06 08:56:36
【问题描述】:

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

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

你有更好的解决方案吗?

谢谢

【问题讨论】:

  • 当然,这很容易。请不要写给我一个解决方案类型的问题。
  • 谢谢。我对这里的人的期望更高...
  • @user144555 虽然我当然不同意上述 cmets 的措辞,但您应该展示您自己尝试解决问题的方法,并解释它失败的原因。
  • @user144555 另外,虽然我可以阅读希伯来语 - 这里只使用英语。解释您的情况,并解释您正在寻找提示,而不是完整的解决方案,除了您自己的解决方案以及为什么它不够好,您会得到更好的答案。

标签: c++ c algorithm data-structures


【解决方案1】:

首先请注意,您的解决方案不是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)中的Dynamic Programming高效计算,计算辅助函数(矩阵)的预处理也是O(n^2)。

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

【讨论】:

    猜你喜欢
    • 2011-12-27
    • 2015-02-13
    • 2013-09-17
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2013-06-22
    • 1970-01-01
    相关资源
    最近更新 更多