关于立体图形切n刀最多切多少块的结论及推导
思路主要参照了知乎这个话题下德安城和安堇然的回答。自己再写一遍主要是为了加深理解。
首先直接给出结论:
在d维空间内,对于被切中的d维立体,每一刀将造成d-1维的划痕,将该d维立体分成两部分,则切n刀后得到的块数最多为:
f(d,n)=\Sigma_{k=0}^{d}C_n^k
其中,d表示维数,可以从0开始取,n表示切的刀数。
为了推导过程表述方便,我们要先给出一个符号定义:
n^{\underline k}=n*(n-1)*\cdots*(n-k+1)
当 n=kn=k时,即上式等于 n!n!
我们再证明一个引理:
\Sigma_{r=1}^{n-1}r^{\underline k}=\frac{n^{\underline {k+1}}}{k+1}
方法是数学归纳法。
- 首先由于当k>rk>r时,rk−=0r^{\underline k}=0,所以n≤kn\leq k时,结果是0
- 所以我们从n=k+1n=k+1时开始考虑: 此时
左式=kk−=k!左式=k^{\underline k}=k!,
右式=(k+1)k+1k+1=(k+1)!k+1=k!=左式右式=\frac{(k+1)^{k+1}}{k+1}=\frac{(k+1)!}{k+1}=k!=左式
得证:n=k+1n=k+1时,Σn−1r=1rk−=nk+1−−k+1\Sigma_{r=1}^{n-1}r^{\underline k}=\frac{n^{\underline {k+1}}}{k+1}, - 令n=n+1
左式=nk−+Σn−1r=1rk−=nk−+nk+1−−k+1=(k+1)∗nk−+nk+1−−k+1左式=n^{\underline k}+\Sigma_{r=1}^{n-1}r^{\underline k}=n^{\underline k}+\frac{n^{\underline {k+1}}}{k+1}=\frac{(k+1)*n^{\underline k}+n^{\underline {k+1}}}{k+1}
由于(k+1)∗nk−=(k+1)∗n∗(n−1)∗⋯∗(n−k+1)(k+1)*n^{\underline k}=(k+1)*n*(n-1)*\cdots*(n-k+1)
且nk+1−−−=n∗(n−1)∗⋯∗(n−k+1)∗(n−k)n^{\underline {k+1}}=n*(n-1)*\cdots*(n-k+1)*(n-k)
所以:(k+1)∗nk−+nk+1−−−=(n−k+k+1)∗nk−=(n+1)k−(k+1)*n^{\underline k}+n^{\underline {k+1}}=(n-k+k+1)*n^{\underline k}=(n+1)^{\underline k}
所以在n=n+1n=n+1时,Σnr=1rk−=(n+1)k+1−−k+1\Sigma_{r=1}^{n}r^{\underline k}=\frac{(n+1)^{\underline {k+1}}}{k+1} - 综上所述,Σn−1r=1rk−=nk+1−−k+1\Sigma_{r=1}^{n-1}r^{\underline k}=\frac{n^{\underline {k+1}}}{k+1}
然后我们考虑切分d维立体图形的过程
- d=0d=0,此时f(0,n)=1f(0,n)=1,这个应该比较显然
- d=1d=1,此时f(1,n)=n+1f(1,n)=n+1,直观来讲,就是n个点可以将一条线切成n+1段 ,这个结果也可以表示为
f(1,n)=f(1,n−1)+f(0,n)
f(1,n)=f(1,n-1)+f(0,n)
- d=2d=2,此时我们假设已经切了n-1刀,最多已经形成了f(2,n−1)f(2,n-1)个小平面。为了能够让第n条割线割出最多的小平面,我们应当让第n条直线与之前的n-1条直线都有交点。
如下:是一个正方形平面已经被4条(黑色)直线最大化分割后,添加第5条(蓝色)直线的方法:
黄色区域是产生新平面的区域,我们可以将黄色区域抽象化为一条直线段,那4条黑色的直线将这条线段分割成了f(1,4)=4f(1,4)=4段,我们第5条线将这条小平面构成的抽象线段的每一小段都分成了两份,所以平面增加数为:f(1,4)f(1,4)。
以此类推,我们就得到了d=2d=2情况下的最大分割数的递推公式:f(2,n)=f(2,n−1)+f(1,n−1)f(2,n)=f(2,n-1)+f(1,n-1)
- d=3d=3时,我们同样假设已经有n-1个平面已经将一个立方体最大化分割了,这时我们要加入第n个平面,这种情况下,我们也可以让第n个平面穿过其余的n-1个平面,其路径上的小立体都会被分割成两块,所以增加的数量就是f(2,n−1)f(2,n-1),
由此,我们得到了d=3d=3情况下的最大分割数递推公式:f(3,n)=f(3,n−1)+f(2,n−1)f(3,n)=f(3,n-1)+f(2,n-1)
- ⋯\cdots
- 那么类比得到的递推式是:
f(d,n)=f(d,n−1)+f(d−1,n−1)
f(d,n)=f(d,n-1)+f(d-1,n-1)
我们现在得到了d维图形,切了x刀的递推式(其实到这里,计算复杂度已经跟刚开始的结论一样了,主要是感觉要推不出解析解了23333):
f(d,x)=f(d,x-1)+f(d-1,x-1)
移项得到:
f(d,x)-f(d,x-1)=f(d-1,x-1)
进行求和得到:
f(d,n)=f(d,0)+\Sigma_{x=1}^{n}[f(d,x)-f(d,x-1)]=1+\Sigma_{x=1}^{n-1}f(d-1,x)
在德安城的回答中,他设了f(d,n)=Σdk=0ad,k∗nk−f(d,n)=\Sigma_{k=0}^{d}a_{d,k}*n^{\underline k},这一步非常巧妙,直接导致了最后解出来的ad,ka_{d,k}非常简洁,我还没有参透。
所以上式可以化为:
f(d,n)=1+\Sigma_{x=1}^{n-1}\Sigma_{k=0}^{d-1}a_{d-1,k}*x^{\underline k}
f(d,n)=1+\Sigma_{k=0}^{d-1}(a_{d-1,k}*\Sigma_{x=1}^{n-1}x^{\underline k})
在上面的引理中已经证明了
\Sigma_{x=1}^{n-1}x^{\underline k}=\frac{n^{\underline {k+1}}}{k+1}
所以
f(d,n)=1+\Sigma_{k=0}^{d-1}a_{d-1,k}*\frac{n^{\underline {k+1}}}{k+1}
f(d,n)=1+\Sigma_{k=1}^{d}a_{d-1,k-1}*\frac{n^{\underline {k}}}{k}
又因之前设了:
f(d,n)=\Sigma_{k=0}^{d}a_{d,k}*n^{\underline k}=1+\Sigma_{k=1}^{d}a_{d-1,k-1}*n^{\underline k}
比较得:
a_{d,k}=\frac{a_{d-1,k-1}}{k}=\frac{a_{d-2,k-2}}{k(k-1)}=\cdots=\frac{1}{k!}
所以
f(d,n)=\Sigma_{k=0}^{d}\frac{n^{\underline k}}{k!}=\Sigma_{k=0}^{d} C_{n}^{k}
关于立体图形切n刀最多切多少块的结论及推导相关推荐
- 切蛋糕能最多切多少块的问题
本文只说明垂直桌面切的水平情况,不讨论空间问题. Problem Description 一个人在吃蛋糕前都会随机决定要切几刀,而且保证切完之后得到最多块蛋糕(只能垂直于底面切).有时候切得太多他自己 ...
- n刀切蛋糕问题(最多切多少块c语言)
分析:第一刀两块每切一刀多i块 //n刀切蛋糕问题,最多多少块 #include<stdio.h> int main(){int n,i;//i刀int cake;printf(" ...
- 【每周一算】一张大饼切n刀,最多可以切多少块?
这是无意中在一个录音中听到的一个题目:一张很大很大的饼,给你一把足够长的刀,切n刀,最多可以得多少块? 这个问题听起来很简单,还是用程序记录一下吧. 解题:一刀都不切,有1块饼: 切第一刀,得2块饼: ...
- 切蛋糕n刀最多切成几分
这道题要一步一步来的: (1) n条直线最多分平面问题 题目大致如:n条直线,最多可以把平面分为多少个区域. 析:可能你以前就见过这题目,这充其量是一道初中的思考题.但一个类型的题目还是从简单的入手, ...
- c语言 一张圆薄饼,切100刀,最多能切成多少块 c语言,甜甜圈上切两刀,最多能切成多少块?...
作者:卜辰璟 所属院系 数学科学系 关键词:甜甜圈切块 几何 摘要 在甜甜圈上切两刀,最多能切成多少块? 这是一个有趣的问题,但是寻找答案的过程体现了解决数学问题的一般流程:通过直觉猜想出可能的方法和 ...
- java 圆类 圆锥类_以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone
学习内容:以圆类 Circle 及立体图形类 Solid 为基础设计圆锥类 Cone 代码示例: import java.util.Scanner; class Point4{ private dou ...
- 利用PCL库做简单的三维立体图形
利用PCL库画简单的三维立体图形需要知道各种图形的参数方程,然后给每个参数赋值便可以. 圆柱面的参数方程为:x = R*cos(θ); y = R*sin(θ); z = z;其中 θ范围是[-2*P ...
- java 图形_java 画立体图形
参数: xPoints - x 坐标数组. yPoints - y 坐标数组. nPoints - 点的总数. 下面是我的demo程序: import java.awt.Color; import j ...
- Java实验项目三——平面图形和立体图形抽象类
Program:按照下面要求完成类的设计 (1)设计一个平面图形抽象类和一个立体图形抽象类,提供该类对象公共的方法和属性. (2)修改项目三中第2题中所设计的球类.圆柱类,圆锥类.矩形类.三角形类.圆 ...
最新文章
- 关于OpenCV中常见函数用法总结
- 自己动手写C语言编译器(5)
- golang 函数结束后 goroutine退出机制
- linux module原理,NodeJS的模块原理
- [python 学习] requests 库的使用
- oracle 分区字符转换,Oracle 普通表与分区表转换
- unittest Module中的常用6种断言方法
- python统计行号_用Python实现两个文件的不同行的编号
- python变量的数据类型
- 监控服务器系统密码忘了怎么办,监控服务器登录密码忘记了怎么办
- 【二十六】redis之事务、事务特性、与pipeline比较,与Lua脚本比较
- 1236. Find All Numbers Disappeared in an Array
- uci2019计算机录取,美国加州大学这九所分校2019最新录取数据
- 【实战总结】根据地图经纬度及范围查询坐标点信息
- Html HBuilder封装APP
- 关于安装cmd命令行安装pyinstaller库失败的解决方法
- 被高通裁员两次,清华毕业华裔工程师跳楼身亡!中年IT男,为何这么难?
- CDR X7 限时3折618年中大促,是时候出手了!
- 家里宽带都200M了,为什么网速这么慢?简单设置一下
- 【工具】批量修改文件名
热门文章
- Maven系列学习(2)——java project的创建
- 阿里云服务器申请流程
- android sdk引入 微信分享_Android分享 ShareSDK微信分享详解
- 空间几何变换 之 齐次坐标
- C primer plus(第六版)第五章源代码
- 注解和注解处理器APT
- ArcGIS使用(二)ArcGIS加载天地图
- non-compatible bean definition of same name and class [com.echo.util.FileUploadDispatcher]
- BASNet: Boundary-Aware Salient Object Detection论文学习
- 一分二网线连接器正确使用方法