递推关系之划分空间问题(hdu 1290&&2050)

其实在写这篇文章之前,感觉上与现在的计算机技术并没有什么联系。但是,线段与平面划分空间的问题是代数结构,特别是递推关系中一类十分重要的题目。所以在这里特写一篇文章,对这一类的问题进行分析。

我们知道,平面是二维的,而空间是三维的,这一类划分空间的问题是具有很多共性的。首先,我们来思考两条直线划分平面的问题.

一条直线可以将平面划分为两个部分,两条直线最多可以将平面划分为4个部分,当有n条直线呢?

我们可以发现,空间的划分是有交点个数的多少来决定的。第n条直线最多可以与其余的直线有n-1个焦点,被划分为2条射线和n-2条线段,与此同时,会多出n个空间。

于是,我们得到了一个递推公式f(n)=f(n-1)+n.

下面一个问题:http://acm.hdu.edu.cn/showproblem.php?pid=2050

题意就是:有n个v型(共起点射线),最多可以将平面分割成为多少个空间。

                    我们容易知道,1个v型可以将平面分割成为2个空间,而在第n个v字加入时,平面上已有2(n-1)条射线。这样我们最多可以与其余的v字有4(n-1)个交点,但是,v字不是相交直线而是两条共起点的射线,所以在具体划分时会少一个空间,得到递推公式f(n)=f(n-1)+4n-3.

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int c,n;
long long num[10005] = {0,2};
int main()
{
	int i;
	for (i = 2; i <= 10000; i++)
		num[i] = num[i - 1] + 4 * i - 3;
	cin >> c;
	while (c--)
	{
		cin >> n;
		cout << num[n] << endl;
	}
	return 0;
}
下面是最后一个问题:http://acm.hdu.edu.cn/showproblem.php?pid=1290

问题的大意就是,n个平面最多可以将空间分为多少个部分。

我们容易知道,1个平面最多可以将空间分为2个部分,对于第n个平面来说,其最多可以和其余的平面有n-1条交线,而这n-1个平面,要达到分割的最大化,必须互不平行,所以我们得到n-1条互相会相交的直线,他们的相交即标志着新空间的诞生。所以我们知道g(n)=g(n-1)+f(n-1)得到这一层递推关系之后,我们的得到以下的代码:

#include<iostream>
#include<cstdio>
using namespace std;
long long num[1005] = {0,2};
int n;
int main()
{
	int i;
	for (i = 2; i <= 1000; i++)
		num[i] = num[i - 1] + (i*(i - 1)) / 2 + 1;
	while (scanf_s("%d", &n) != EOF&&n)
		cout << num[n] << endl;
	return 0;
}

以上的问题都遵从一个特点,即初始条件十分容易得到,而对于大数据往往很难得到,所以我们要做的就是得到从n-1到n的转移方程,问题便迎刃而解。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值