动态规划入门之求解斐波那契数列

动态规划入门之求解斐波那契数列

斐波那契数列,除了可以用跟递归方法来处理,还可以使用动态规划方法(DP)来求解。区别在于,如果使用动态规划方法,中间结果要“缓存”起来,以备后续使用,这样时间复杂度即优化为O(N)。动态规划的具体做法就是将每次调用fibonacci(i)的结果“缓存”起来。

在普通电脑上,递归版本生成第50项斐波那契数用时可能超过一分钟,而动态规划方法只需几毫秒就能产生第10000项斐波那契数。当然,若采用int型变量,很快就会溢出,需要改为long long类型。

动态规划方法求解斐波那契数列的代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

#define N 200000000
long long num[N+1];                  // 全局变量,初始化为0
long long fib(unsigned i)
{
    if (i <= 1) return i;
    if(num[i] != 0) return num[i];   // 不为0时表明数据有更新, 返回先前缓存的结果
    num[i] = fib(i-1) + fib(i-2);    // 缓存结果
    return num[i];
}

int main()
{
    int m;
    while(cin>>m)  // in: 1499 out: 6688774161928657529
    {
        cout<<fib(m)<<endl;
        // memset(num, 0, sizeof(num));
    }
    return 0;
}

相关链接:
http://blog.csdn.net/lzuacm/article/details/51164970

Reference: Crackling the Code Interview - chapter 9

猜你喜欢

转载自blog.csdn.net/yanglr2010/article/details/52841464