动态规划入门之求解斐波那契数列
斐波那契数列,除了可以用跟递归方法来处理,还可以使用动态规划方法(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