递推算法之平面分割问题总结

这是一类问题,首先由直线划分区域到折线划分区域,再延伸到封闭图形划分区域,最后在推广为平面划分空间的问题。

一、n条直线最多分平面问题

题目大致如:n条直线,最多可以把平面分为多少个区域。

析:可能你以前就见过这题目,这充其量是一道初中的思考题。当有n-1条直线时,平面最多被分成了f(n-1)个区域。则第n条直线要是切成的区域数最多,就必须与每条直线相交且不能有同一交点。 这样就会得到n-1个交点。这些交点将第n条直线分为2条射线和n-2条线断。而每条射线和线断将以有的区域一分为二。这样就多出了2+(n-2)个区域。

故:f(n)=f(n-1)+n

=f(n-2)+(n-1)+n

……

=f(1)+1+2+……+n

=n(n+1)/2+1

二、折线分平面(hdu2050)

根据直线分平面可知,由交点决定了射线和线段的条数,进而决定了新增的区域数。当n-1条折线时,区域数为f(n-1)。为了使增加的区域最多,则折线的两边的线段要和n-1条折线的边,即2*(n-1)条线段相交。那么新增的线段数为4*(n-1),射线数为2。但要注意的是,折线本身相邻的两线段只能增加一个区域。

故:f(n)=f(n-1)+4(n-1)+2-1

=f(n-1)+4(n-1)+1

=f(n-2)+4(n-2)+4(n-1)+2

……

=f(1)+4+4*2+……+4(n-1)+(n-1)

=2n^2-n+1

三、三角形划分区域(hdu1249)

解析:当n-1个三角形时,区域面积数为 f(n-1) 。

要区域数最多,那么第n个三角形就必须与前n-1个三角形相交。
           则第n个三角形的一条边就被分割成 2*(n-1)-1条线段与两个半条的线段 ,
           即相当于2*(n-1)条线段。则第 n 个三角形被分割成 3*2*(n-1)条线段。
           则增加了 6*(n-1)个面。

故:f(n)=6*(n-1)+f(n-1)

f(n-1)=6*(n-2)+f(n-2)

........

f(2)=6*1+f(1)

因为,f(1)=2

所以,f(n)=3*n*(n-1)+2

四、封闭曲线分平面问题

题目大致如设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。

析:当n-1个圆时,区域数为f(n-1).那么第n个圆就必须与前n-1个圆相交,则第n个圆被分为2(n-1)段线段,增加了2(n-1)个区域。

故: f(n)=f(n-1)+2(n-1)

=f(1)+2+4+……+2(n-1)

=n^2-n+2

五、平面分割空间问题(hdu1290)

由二维的分割问题可知,平面分割与线之间的交点有关,即交点决定射线和线段的条数,从而决定新增的区域数。试想在三维中则是否与平面的交线有关呢?当有n-1个平面时,分割的空间数为f(n-1)。要有最多的空间数,则第n个平面需与前n-1个平面相交,且不能有共同的交线。即最多有n-1 条交线。而这n-1条交线把第n个平面最多分割成g(n-1)个区域。(g(n)为(1)中的直线分平面的个数 )此平面将原有的空间一分为二,则最多增加g(n-1)个空间。

故:f=f(n-1)+g(n-1)     ps:g(n)=n(n+1)/2+1

=f(n-2)+g(n-2)+g(n-1)

……

=f(1)+g(1)+g(2)+……+g(n-1)

=2+(1*2+2*3+3*4+……+(n-1)n)/2+(n-1)

=(1+2^2+3^2+4^2+……+n^2-1-2-3-……-n )/2+n+1

=(n^3+5n)/6+1

时间: 2024-08-04 01:56:19

递推算法之平面分割问题总结的相关文章

递推算法与二分算法

递推算法: (一)斐波那契数列 以下数列0 1 1 2 3 5 8 13 21 …被称为斐波纳契数列. 这个数列从第3项开始,每一项都等于前两项之和. 输入一个整数N,请你输出这个序列的前N项. 输入格式 一个整数N. 输出格式 在一行中输出斐波那契数列的前N项,数字之间用空格隔开. 数据范围 0<N<460<N<46 输入样例: 5 输出样例: 0 1 1 2 3 #include<iostream> using namespace std; int f[100];

001-算法-递推法

一.概念: 递推算法是一种简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法.递推分为顺推和逆推两种. 递推算法使用“步步为营”的方法,不断利用已有的信息推导出新的东西. 顺推法:是指从已知条件出发,逐步推算出要解决问题的方法.例如:斐波拉契数列就可以通过顺推法不断递推算出新的数据. 逆推法:是从已知的结果出发,用迭代表达式逐步推算出问题开始的条件,即顺推法的逆过程. demo : http://blog.csdn.net/jtlyuan/article/details/7

递推(一):递推法的基本思想

所谓递推,是指从已知的初始条件出发,依据某种递推关系,逐次推出所要求的各中间结果及最后结果.其中初始条件或是问题本身已经给定,或是通过对问题的分析与化简后确定. 利用递推算法求问题规模为n的解的基本思想是:当n=1时,解或为已知,或能非常方便地求得:通过采用递推法构造算法的递推性质,能从已求得的规模为1.2.….i−1的一系列解,构造出问题规模为i的解.这样,程序可从i=0或i=1出发,重复地由已知至i−1规模的解,通过递推,获得规模为i的解,直至获得规模为n的解. 可用递推算法求解的问题一般有

递推(二):递推法的应用

下面通过一些典型实例及其扩展来讨论递推法的应用. [例2]骨牌铺方格 在2×n的一个长方形方格中,用一种2×1的骨牌铺满方格.输入n(n<=40),输出铺放方案的总数. 例如n=3时,为2×3方格,骨牌的铺放方案有三种,如下图1所示. 图1  2×3方格的骨牌铺放方案 (1)编程思路. 设f[i]为铺满2*n方格的方案数,则有    f[i]=f[i-1]+f[i-2]. 其中,f[i-1]为铺满2*(n-1)方格的方案数(既然前面的2*(n-1)的方格已经铺满,那么最后一个只能是竖着放).f[

算法基础二 递推法

/*递推法*/ /*斐波那契数列 1 1 2 3 5 8 13..... f(n)?*/ /*递推法的特点是由前向后推算,因此注意起始条件,并在推算过程中保存结果供下一步推算使用~*/ #include<iostream> using namespace std; int f1(int n) { if (n < 3)return 1; else { int t1 = 1; int t2 = 1; for (int i = 2; i < n; i++) { int temp = t1

数学:平面分割直线

我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目.比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示.折线分割平面" alt="杭电acm2050 折线分割平面" src="http://static.oschina.net/uploads/img/201509/07110015_GMTF.jpg"> Input 输入数据的第一行是一个整数C,表示测试实例的个数,然后

算法设计 之 递推法

递推法就是根据已知条件,分析推导出问题中的联系,然后一步一步进行推倒直至得到结果. 根据具体问题我们需要选择是正推还是逆推来解决问题. 下面先举一个递推中的经典例子,就是求兔子数量的问题: 现有一只一个月大的兔子,已知当兔子在第三个月大时每月就可以生下一只小兔子(好吧,就按兔子是无性繁殖的),求一年后兔子的总数量. 我们根据问题分析,发现可以把兔子分三类:一个月大.二个月大.三个或三个以上月大,列表分析: 月份 1月大 2月大 >=3月大 1 1 0 0 2 0 1 0 3 1 0 1 4 1

平面分割问题

(1) n条直线最多分平面问题 题目:n条直线,最多可以把平面分为多少个区域. 解析:       当有n-1条直线时,平面最多被分成了f(n-1)个区域.      则第n条直线要是切成的区域数最多,就必须与每条直线相交且不能有同一交点.      这样就会得到n-1个交点.这些交点将第n条直线分为2条射线和n-2条线断.      而每条射线和线断将以有的区域一分为二.这样就多出了2+(n-2)个区域. 故:f(n)=f(n-1)+n f(n-1)=f(n-2)+n-1 --        

实用算法的分析与程序设计——递推法(顺推法)包含实例,代码

顺推法即由边界条件出发,通过递推关系式推出后项值,再由后项值按递推关系式推出再后项值...依次递推,直至从问题初始陈述向前推进到这个问题的解为止. 实例 代码 #include<iostream> #include<stdlib.h> using namespace std; const int maxN = 60 ; int N = 4 ,d = 2 , m = 3; float a1 = 2 ,an = 5; void input() { cout<<"i