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

动态规划入门: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√


你可能感兴趣的:(C++,计算机科学)