直线分割平面(动态规划递推)

在一个平面上有一个圆和n条直线,这些直线中每一条在圆内同其他直线相交,假设没有3条直线相交于一点,试问这些直线将圆分成多少区域。

/*
思路:
n=1时有两个平面
这时让n=2,多一条直线,这条直线最多与n-1条直线也就是1个直线相交
相交后有n-1个交点,那么这条新直线最多接触到n个平面
这n个平面都被一分为二,产生了n个新平面,所以f[i]=f[i-1]+i

举例:
当n=2时有2条直线4个平面
这时加入第三条,他最多与n=2每个直线相交一次
然后最多接触到3个平面
接触到的平面都被一分为二
所以f[3]=f[2]+2
*/
//本题代码只考虑一组数据
#include<bits/stdc++.h>
#define ll long long
const ll maxn=100;
using namespace std;
ll f[maxn]={0};
int main()
{
    ll n;
    cin>>n;

    f[1]=2;
    for(ll i=2;i<=n;i++)
        f[i]=f[i-1]+i;
    cout<<f[n]<<endl;
    //可以把for循环改成等差数列前n项和求和,
    //f[1]=2
    //f[2]=2+2
    //f[3]=2+2+3
    //f[4]=2+2+3+4
    //那么f[n]=2+(2+3+4+5+....+n)
//                  =2+(-1)+(n*(n+1))/2


}

猜你喜欢

转载自www.cnblogs.com/zyacmer/p/9907282.html