分割平面(递推之分割品面)
程序员文章站
2022-06-02 22:15:46
...
分割平面
总时间限制: 1000ms 内存限制: 65536kB
描述
设有n条封闭曲线画在平面上,而任何两条封闭曲线恰好相交于两点,且任何三条封闭曲线不相交于同一点,问这些封闭曲线把平面分割成的区域个数。
输入
一个数n(1≤n≤46341)
输出
一个数,这些曲线把平面分割成的个数总和
样例输入
3
样例输出
8
提示
寻找递推式
思路点拔:五大经典递推关系中的一种,在这里我在仔细证明一下这种问题的递推式
解:设an为n条封闭曲线把平面分割成的区域个数。 由图可以看出:a2-a1=2;a3-a2=4;a4-a3=6
从这些式子中可以看出an-an-1=2(n-1)。当然,上面的式子只是我们通过观察4幅图后得出的结论,它的正确性尚不能保证。下面不妨让我们来试着证明一下。当平面上已有n-1条曲线将平面分割成an-1个区域后,第n条曲线每与曲线相交一次,就会增加一个区域,因为平面上已有了n-1条封闭曲线,且第n条曲线与已有的每一条闭曲线恰好相交于两点,且不会与任两条曲线交于同一点,故平面上一共增加2(n-1)个区域,加上已有的an-1个区域,一共有an-1+2(n-1)个区域。所以本题的递推关系是an=an-1+2(n-1),边界条件是a1=1。
这样写应该已经很明确了,上代码吧!
#include<cstdio>
long long a[46350]={0,2}; //a数组用来递推,注意要使用longlong类型
int main()
{
int n;
scanf("%d",&n);//输入有多少条曲线
for(int i=2;i<=n;i++) //循环枚举曲线数
{
a[i]=a[i-1]+2*(i-1); //递推式
}
printf("%lld",a[n]); //输出解
return 0; //结束
}
/*代码量超级短,但是还是那句话,想到了就简单,没想到就复杂,这些题唯一的秘诀就是
多多练习,这种题也经常在竞赛中出现,所以要多想一想,在草稿纸上多算一算,才能找出
正确的递推式哦~*/