直線分割平面
求n條直線最多可以把平面分爲多少個區域
當有n-1條直線時,平面最多被分爲f(n-1)個區域。要使加入第n條直線後使區域數最多,則第n條直線要和前面的n-1條直線都相交,且沒有任何三條直線相交於一個點。這樣就會得到n-1個交點。這些交點將第n條直線分成兩條射線和n-2條線段。而每條射線和線段將已有的區域一分爲二。這樣就多出了2+(n-2)個區域(即n)。
f(1)=2
f(n)=f(n-1)+n=1+1+2+3+...+n=1+n*(n+1)/2
#include<bits/stdc++.h>
using namespace std;
long long a[25];
int main()
{
int n;
a[1]=2;
for(int i=2;i<=20;i++)
a[i]=a[i-1]+i;
while(cin>>n)
cout<<a[n]<<endl;
}
//或cout<<1+n*(n+1)/2<<endl;
折線分割平面
根據上面的直線分割平面可知,交點決定了射線和線段的條數,進而決定了新增的區域數。
當有n-1條折線時,最大區域數爲f(n-1)。當加入第n條折線時,爲了使增加的區域最多,則折線的兩邊的線段要和n-1條折線的邊,即2*(n-1)條線段相交。這樣就會得到4*(n-1)個交點,這些交點將第n條折線分爲2條射線和4*(n-1)條線段。需要注意:折線本身相鄰的兩個線段只能增加一個區域(上圖中的6區域)
f(1)=2
f(n)=f(n-1)+4*(n-1)+2-1=f(n-1)+4*(n-1)+1=2n^2-n+2
練習:HDU 折線分割平面
Problem Description
我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。
Input
輸入數據的第一行是一個整數C,表示測試實例的個數,然後是C 行數據,每行包含一個整數n(0<n<=10000),表示折線的數量。
Output
對於每個測試實例,請輸出平面的最大分割數,每個實例的輸出佔一行。
Sample Input
2
1
2
Sample Output
2
7
#include<bits/stdc++.h>
using namespace std;
long long a[10005];
int main()
{
int C;
a[1]=2;
for(int i=2;i<=10000;i++)
a[i]=a[i-1]+4*(i-1)+1;
cin>>C;
while(C--)
{
int n;
cin>>n;
cout<<a[n]<<endl;
}
return 0;
}
//或cout<< 2*n*n-n+2 <<endl;
遞推算法總結: