杭电1290

来源:互联网 发布:移动端底部广告js 编辑:程序博客网 时间:2024/06/05 00:28

自己想始终想不明白,看了别人的之后觉得其实不难,关键是不会转换

#include<iostream>
using namespace std;
int main()
{
 int n;
 while(cin>>n)
 {
  cout<<(n*n*n+5*n+6)/6<<endl;
 }
}

 

分割思路:

 

这个首先要从最简单的情况来看了,即n个点可以把一条直线最多分成几部分,这个问题很容易结果是n+1
然后再看平面的情况,即n条直线可以把一个平面最多分成几部分(设为An).最多的情况是这样的,所有直线都相交,而且没有公共交点.这时候考虑递推关系,如果已经有了n条直线满足上述条件,那么再增加一条与这n条直线相交的直线,这条直线与其它n条直线有n个交点,被分成了n+1段,每一段将它所在的区域一分为二,那么得到递推式A(n+1)=A(n)+n+1.接着算出A(n)=(n^2+n+2)/2
再来看三维空间的情况,也就是你的问题n个平面可以把一个空间分成几部分(设为Bn).最多的情况是所有平面都相交且没有公共交线所有交线也没有公共交点.
这时来看递推的关系,如果已有满足上述条件的n个平面,再增加一个满足条件的平面,这个平面与其它n个平面有n条交线,这n条交线把这个平面分成(n^2+n+2)/2个部分,每个部分将它所在的区域一分为二.所以递推式是B(n+1)=B(n)+(n^2+n+2)/2.然后算出B(n)=(n^3+5n+6)/6

原创粉丝点击