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