HDU2050折線分割平面(遞推)

折線分割平面

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 44771 Accepted Submission(s): 29584

Problem Description
我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。

Input
輸入數據的第一行是一個整數C,表示測試實例的個數,然後是C 行數據,每行包含一個整數n(0<n<=10000),表示折線的數量。

Output
對於每個測試實例,請輸出平面的最大分割數,每個實例的輸出佔一行。

Sample Input
2
1
2

Sample Output
2
7

/*遞推找規律:2*a*a - a + 1 */
#include<iostream>
using namespace std;
int main(){
	int c , a;
	cin >> c;
	while ( c --){
		cin >> a;
		cout << 2*a*a - a + 1 << endl;
	}
	return 0 ;
} 

直線的平面分割問題

  1. 當第n條直線分割前n-1塊平面時,f(n) = f(n-1) + k 。
  2. k 爲第n條直線切割後多出來的部分。
  3. 如果想要切出來最多的平面,第n條直線不能與其中任何直線的交點相交。
  4. 此時的第 n 條線被割裂分成兩條射線 和 n - 2 條線段。
  5. 而每條線段將所在的區域切割成兩塊,射線也將所在區域切割成兩塊。
  6. 也就是再原來的基礎上又產生了一塊。
  7. 所以 此時的 k = n-2 + 2 。
  8. 所以遞推公式爲 f(n) = f(n-1) + n; f(1) = 2; f(2) = 4;f(3) = 7…
  9. 前n項化簡得 f(n) = n*(n+1) / 2 + 1 。

折線的平面分割問題

  1. 折線得分割和上面的相仿。
  2. 首先列出公式f(n) = f(n-1) + k,然後分析k爲何值。
  3. 第 n 條折線產生了 2 * (n-1) 個交點。 2 條射線,22(n-1) 條線段,因爲一條折線等於兩條線段。
  4. 每多產生的線段在原有的區域上多割開了一塊區域。而折線的存在又多產生了一塊區域。
  5. 故 k =4 * (n-1) + 2 - 1 , 即 f(n) = f(n-1) + 4*(n-1) + 1;f(1) = 2;
  6. 化簡得 f(n) = 2 * n * n - n + 1 ;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章