斐波拉契数列的递推应用(HDU 2044+ HDU 2041 +HDU 2018)

我是从这题接触到斐波拉契数列的。
杭电2044—一只小蜜蜂
最开始写这道题是自己推出了公式。设当前所在的位置为x处,下一步可能出现的位置在 x+1 或者在 x+2处。这就可以理解为从出发点到目的地的过程中(假想为一条直线),你可以选择每一次走两步或者每一次走一步(同这题杭电2041—超级楼梯)。应用排列组合的思想就相当于将一个长度为n(在本题中是b-a)的线段分成多份(其中每份只能为1或者为2),然后将这些小线段组合,问一共有几种组合方式。我的思路是这样的:
当有0段长度为2的线段时,一共有C(n-2*0+0,0)=C(n,0)种;
当有1段长度为2的线段时,一共有C(n-2*1+1,1)=C(n-1,1)种;
当有2段长度为2的线段时,一共有C(n-2*2+2,2)=C(n-2,2)种;

以此类推,
sum=C(n,0)+C(n-1,1)+C(n-2,2)+…+C(n-m,m) (m< n)
然后兴致勃勃交上去结果TLE了。
于是我百度了一下,发现sum这个求和公式和斐波拉契公式好像。
斐波拉契数列中:
f⑴=C(0,0)=1。
f⑵=C(1,0)=1。
f⑶=C(2,0)+C(1,1)=1+1=2。
f⑷=C(3,0)+C(2,1)=1+2=3。
f⑸=C(4,0)+C(3,1)+C(2,2)=1+3+1=5。
f⑹=C(5,0)+C(4,1)+C(3,2)=1+4+3=8。
F⑺=C(6,0)+C(5,1)+C(4,2)+C(3,3)=1+5+6+1=13。
……
F(n)=C(n-1,0)+C(n-2,1)+…+C(n-1-m,m) (m<=n-1-m)
于是就AC了。

int main()
{
    fib[0]=fib[1]=1;
    for(int i=2;i<=50;i++)
    {
    fib[i]=fib[i-1]+fib[i-2];
    }
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        printf("%lld\n",y-x==0?0:fib[y-x]);//当n为0时注意特判
    }
    return 0;
}

感觉斐波拉契数列好神奇,应用也比较广。
比如杭电2018—母牛的故事,就是有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛。这题和兔子繁殖问题差不多但是还是有点不同。经典的额兔子繁殖问题是兔子在出生两个月后,就有繁殖能力,一对兔子每个月能生出一对小兔子来。如果所有兔子都不死,那么一年以后可以繁殖多少对兔子。其通项是F(n)=F(n-1)+F(n-2);
用母牛这题来举例子说明不同:
F(1)=1;
F(2)=1+1=2;
F(3)=2+1=3;
F(4)=3+1=4=F(1)+F(3);
F(5)=4+1+1=6=F(2)+F(4); //去年的+母牛生一头牛+第二年生的小牛长大生的小小牛
F(6)=6+1+1+1=9=F(3)+F(5); // 去年的+母牛生的+第二年生的小牛长大生的小小牛+第三年生的小牛长大生的小小牛
….
依次类推:F(n)=F(n-3)+F(n-1);

int main()
{
    fib[1]=1;
    fib[2]=2;
    fib[3]=3;
    for(int i=4;i<=N;i++)
        fib[i]=fib[i-1]+fib[i-3];
    int n;
    while(~scanf("%d",&n))
    {
        if(n==0) break;
        printf("%d\n",fib[n]);
    }
    return 0;
}

还有什么黄金分割与它的关系,杨辉三角啊,斐波拉契构造矩阵,什么数字之谜啊,请移步百度百科—斐波拉契数列个人认为写的极好。

以后再遇到再来更新,目前遇到的就这些了。
(勉强凑合看看。。。憋打我。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值