遞推:HDU 折線分割平面(詳解)

直線分割平面

求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;

內容借鑑:(轉)直線分割平面 與 平面分割區域 問題


遞推算法總結:

遞推算法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章