1. 引
之前做了一道题:
有一个大西瓜, 用水果刀平整地切, 总共切9刀, 最多能切成多少份, 最少能切成多少份?
最少很好求,就是 10 份呗。关键是最多是多少。
这个问题可以一般化为一个很经典的数学问题:
k 个超平面可以把 n 维空间最多分为多少部分?
我们定义 f ( n , k ) f(n,\ k) f(n, k) 表示该问题的解,首先我们会给出这个解的递推公式,然后给出其通项公式。
2. 递推公式
首先考虑平凡问题解:
-
k 个点可以最多把一条直线分成几个部分?
k + 1 k + 1 k+1 个 -
1 个超平面可以最多把 n 维空间分成几个部分?
2 个
所以:
{
f
(
n
,
1
)
=
2
f
(
1
,
k
)
=
k
+
1
\begin{cases} f(n,\ 1) = 2\\ f(1,\ k) = k + 1 \end{cases}
{f(n, 1)=2f(1, k)=k+1
再考虑一般情况 f ( n , k ) f(n,\ k) f(n, k)。我们把它分成两个部分来看:
- 前面 k − 1 k - 1 k−1 刀把空间分成了几份?
我们不知道,但是我们可以用 f ( n , k − 1 ) f(n,\ k - 1) f(n, k−1) 来表示。
- 第 k k k 刀给空间多划分了几份?
这个问题就比较关键了。为了方便理解,我们可以从最简单的二维世界开始讲。如果我们已经在平面上划了 k − 1 k - 1 k−1 条线,现在划第 k k k 条线,且需要尽可能多的分割平面应该怎么做呢?
显然,稍加思考就会发现这是一个贪心问题,可以贪心的求解:只需要让新的一条线同之前所有的线都相交就可以了。原本的 k − 1 k - 1 k−1 条线会把新的线分割成 k k k 个部分,然后新增出 k k k 个空间出来。
如下图所示,原本三条直线把空间分为 7 个部分,新增了一条线后,一下子多出来了 4 个空间。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T7v9SisW-1584633914640)(demo.png)]
同样的道理扩展到 n 维空间也是一样的。原本已经有了 f ( n , k − 1 ) f(n,\ k - 1) f(n, k−1) 个部分,多了一个超平面后,原本的超平面把新的超平面分割为 f ( n − 1 , k − 1 ) f(n - 1,\ k - 1) f(n−1, k−1) 个部分,因此也会多处同样数量的子空间出来。
综上所述,我们有:
{ f ( n , 1 ) = 2 f ( 1 , k ) = k + 1 f ( n , k ) = f ( n , k − 1 ) + f ( n − 1 , k − 1 ) n ⩾ 2 \begin{cases} f(n,\ 1) = 2\\ f(1,\ k) = k + 1\\ f(n,\ k) = f(n,\ k - 1) + f(n - 1,\ k - 1) & n \geqslant 2 \end{cases} ⎩⎪⎨⎪⎧f(n, 1)=2f(1, k)=k+1f(n, k)=f(n, k−1)+f(n−1, k−1)n⩾2
3. 通项公式
通项公式的具体推导很复杂,具体可以见 这里。
这里直接给出结论:
f ( n , k ) = ∑ i = 0 n C k i f(n,\ k) = \sum_{i = 0}^{n}\large C_k^i f(n, k)=i=0∑nCki
比如在三维空间里,9 个平面最多可以把空间分为:
C 9 0 + C 9 1 + C 9 2 + C 9 3 = 130 \large C_9^0 + C_9^1 + C_9^2 + C_9^3 = 130 C90+C91+C92+C93=130
即 130 个部分。