1. 程式人生 > >直線分割平面(動態規劃遞推)

直線分割平面(動態規劃遞推)

在一個平面上有一個圓和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 }