最大正方形 (Largest Square)

最大长方形 问题中,我们探讨了如何寻找最大 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值