动态规划EZ---Fibonacci数列(骨牌铺方格/蜜蜂走蜂房问题)

本文介绍了动态规划入门,重点探讨斐波那契数列及其在HDU2041/2044/2046题目的应用。通过递推和递归方法阐述解决方案,并提出通过数据打表来优化递归计算,减少重复运算,提高效率。

动态规划入门:Fibonacci数列有关题目:HDU2041/HDU2044/HDU2046


斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*)

Fibonacci数列解决方法:

(1):递推法

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int n;
    long long feibo[51];
    feibo[1]=1;
    feibo[2]=1;
    for(int i=3;i<=50;i++)
        feibo[i]=feibo[i-1]+feibo[i-2];   //打表
    while(cin>>n)
        cout<<feibo[n]<<endl;
    return 0;
}


(2):递归法

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
long long data[51];
long long feibo(int n)
{
    if(n==1||n==2)
        return 1;
    else
    {
        if(data[n]==0)
            data[n]=feibo(n-2)+feibo(n-1);  //数组打表,两递归相当于只计算一个大量节省时间
        return data[n];
    }
}
int main()
{
    int n;
    memset(data,0,sizeof(data));
    data[1]=1;
    data[2]=1;
    while(cin>>n)
        cout<<feibo(n)<<endl;
    return 0;
}


总结:在运用递归过程中可以对数据进行打表处理,如上题中的data[n]=f(n-2)+f(n-1),运用递归,但对数据进行打表处理对数据结果进行了储存,在下次运行中可以直接读取而避免重复计算,大量节省了运行时间。新技能get√


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值