在最大长方形 问题中,我们探讨了如何寻找最大 1-聚类。因为正方形是长方形的一个特例,因此,前面讨论的算法也可以应用。然后,正方形在某种意义上是一维的,即,只要知道边的长,就可以确定一个正方形;而长方形是二维的,需要知道两个边长。这个不同,我们猜测,当我们依然采用动态规划来解决问题时,可以把时间复杂度降一维,即为O(mn)。
为了完整性,在这里给出问题描述: 有一个 m x n 的矩阵,元素为 0 或 1。一个子矩阵,如果它所有的元素都是 0, 或者都是 1,则称其为一个 0-聚类 或 1-聚类,统称聚类(Cluster)。请找出最大的聚类(元素最多的聚类),且其为一正方形。
令 OPT(i,j) 表示以元素 (i,j) 为右下角的最大正方形 1-聚类的边长。则有
当 (i,j) 为 0 时: OPT(i,j) = 0
当 (i,j) 为 1 时: OPT(i,j) = min { OPT(i-1,j), OPT(i,j-1), OPT(i-1,j-1) } + 1
该动态方程的正确性可以如下证明:当 (i,j) 为 0 时,显然有 OPT(i,j)=0。当 (i,j) 为 1 时,显然有 OPT(i,j) >= min {OPT(i-1,j),OPT(i,j-1), OPT(i-1,j-1)}+1。假设 OPT(i,j) > min { OPT(i-1,j),OPT(i,j-1),OPT(i-1,j-1)}+1。但显然地, OPT(i-1,j-1) >= OPT(i,j)-1,OPT(i,j-1)>=OPT(i,j)-1 和 O(T(i-1,j)>=OPT(i,j)-1 成立,与假设矛盾。虽然一开始这个 min 可以会有点反直觉。显然,这个动态规划有 mn 个状态,每个状态只有 O(1) 个决策,因此,时间复杂度为 O(mn)。有了这个状态转移函数,代码也不难写了,略去不表。值得注意的是,这个算法只对正方形有效,而不类推到长方形的两个边上。
参考:http://ds-gyan.blogspot.com/2009/12/largest-square-rectangular.html