m x n网格上存在多少个子矩形

时间:2013-07-29 15:08:13

标签: algorithm

给定m x n网格,这样的网格上存在多少个唯一的子矩形?

例如,

1 x 1网格有1个子矩形。

1 x 2网格有3个子矩形。

我正在寻找可用于直接计算现有子矩形数的通用公式。

7 个答案:

答案 0 :(得分:17)

答案是m(m+1)n(n+1)/4

矩形由其在x轴和y轴上的两个投影定义。

在x轴上的投影:对的数量(a,b)使得1 <= a <= b <= m = m(m + 1)/ 2

y轴的同义词

答案 1 :(得分:16)

与@Thomash提供的答案相同,但有更多解释,张贴后人:

如果你能在一个方面解决这个问题,很容易将它移到二维。

让我们来看看1x5:

 5 1x1 squares
+4 1x2 squares
+3 1x3 squares
+2 1x4 squares
+1 1x5 squares = 15 squares.

这个公式很简单:sum = n(1 + n)/ 2。在5的情况下,你想要5(1 + 5)/ 2 = 15。

所以,为了得到你的答案,只需对n和m做这个,然后乘以它们:

sumN = n(1+n)/2
sumM = m(1+m)/2
totalRectangles = nm(1+n)(1+m)/4

答案 2 :(得分:3)

为此,我们假设您有m列和n行:

. . . .
. . . .
. . . .

在上面的网格中,m为4,n为3.如果您选择左上角,则需要知道可以形成多少个矩形。如果选择左上角即

* . . .
. . . .
. . . .

您可以在右侧选择3点,在底部选择2个点,因此总计组合为:3*2 = 6

因此,您可以形成的总数矩形将对应于从(0, 0)top left假定为0, 0)到(m-1, n-1)开始的每个点的矩形总数。< / p>

如果你试图找到这个的总和:

[(m-1)*(n-1) + (m-2)*(n-1) + (m-3)*(n-1) ... + (n-1)] + 
[(m-1)*(n-2) + (m-2)*(n-2) ... + 1*(n-2)] +
[(m-1)*(n-3) + (m-2)*(n-3) ... + 1*(n-3)] +
... 

等于

(n-1)*(1 + 2 + .. + m-1)
+
(n-2)*(1 + 2 + .. + m-1)
+
.
.
+
1*(1 + 2 + ... + m-1)

所以你得到了

(1 + 2 + ... + n-1) * ( 1 + 2 + 3 ... + m-1)
= mn(n-1)(m-1)/4

由于mn是您的情况,因此不是点数,而是形成的线段数。以上公式可以转换:

m = m + 1
&
n = n + 1

它变成了

(n+1)(m+1)mn / 4

答案 3 :(得分:3)

我找到了一个很好的解决方案,
让我们看看网格的表格边框。
要创建一个矩形,我们需要在边框上有四个点。
水平2点,垂直2点

例如,

(n = 4,,m = 5)
请注意,选择是N + 1和M + 1 因为我们看边界而不是矩形本身

以下是一个选择的示例:

grid with 4 point that make rectangle

我们可以使用二项式公式计算所有可能的选择以选择2个水平点和2个垂直点:

(n+1 choose 2) * (m+1 choose 2)

答案 4 :(得分:1)

另一种解决方案,

在m * n网格中,我们有m + 1行和n + 1行相交。

我们使用这个事实,可以通过选择这些线与另一个不在水平线或垂直线上的点之间的交点来形成矩形。

因此,选择交叉点的方法的数量是(m + 1)(n + 1)。 并且随后选择第二个点的方式的数量是[这是选择除相同水平和垂直线中的点之外的交叉点的方式的数量]是((m + 1)(n + 1) - NM-1)

现在考虑1x1网格,我们使用这个网格可以被4个点唯一计数4次。

因此,可以形成的矩形总数是 [(m + 1)(n + 1)((m + 1)(n + 1)-nm-1)] / 4

可以进一步简化为 [(m + 1)(n + 1)(m)(n)] / 4

答案 5 :(得分:1)

有((m + 1) m n *(n + 1))/ 4个包含正方形的矩形[矩形子集]

答案 6 :(得分:-1)

正确的答案应该是(m(m+1)n(n+1))/4减去矩形网格中的方格数。