假设您获得了一个mXn位图,由数组M [1..m,1 .. n]表示,其中的条目 全部为0或1.全一块是M [i .. i0,j ... j0]形式的子阵列,其中每个位等于1.描述并分析一个有效的算法来找到一个全部的在M中阻止最大面积
我正在尝试制作动态编程解决方案。但是我的递归算法在O(n ^ n)时间内运行,即使在记忆之后我也想不到将其降低到O(n ^ 4)以下。有人可以帮我找到更有效的解决方案吗?
答案 0 :(得分:0)
这只是一个想法,我不确定它是否有效。
将A(i,j)(di,dj)定义为从(i,j)到(i + di,j + dj)的全一个块,这意味着对于i< M [x,y] = 1 ; = x< = i + di和j< = y< = j + dj。
如果没有A(i,j)(di + 1,dj)和A(i,则将A(i,j)(di,dj)定义为 max-block J)(二,DJ + 1)。
对于每个(i,j),我们可以构造max-blocks的列表,称之为L(i,j)。列表的最大长度为min(m-i + 1,n-j + 1)< = min(m,n)。
L(i,j)仅取决于M [i,j],L(i + 1,j)和L(i,j + 1)。我认为从L(i + 1,j)和L(i,j + 1)构造L(i,j)可以在线性时间内完成,它提醒我合并排序列表。 利用L(i,j),在L(i,j)中找到A(i,j)(di,dj)的max(di * dj)。这些值的最大值指定最大的全部块。
这种方法具有复杂度n * m * min(m,n)〜= n ^ 3,并且需要min(m,n)^ 2空间来存储所需的最后2行。