我们熟悉的费氏数列也是典型的动态规划的问题。

方法一:

首先用我们常用的递归方法求解:
#include<iostream>
#include<algorithm>
#include<ctime>using namespace std;int F1(int n)
{if (n == 1)return 1;if (n == 2)return 1;return F1(n - 1) + F1(n - 2);
}int main()
{int n;cout << "请输入n的值:";while (cin >> n){time_t time1, time2;time1 = clock();long long result = F1(n);time2 = clock();cout << "F(n) = " << result << "\t耗时:" << (double)(time2 - time1) / CLOCKS_PER_SEC << endl;}cout << __DATE__ << "  " << __TIME__ << endl;system("pause");return 0;
}
运行结果:
请输入n的值:10
F(n) = 55       耗时:0
15
F(n) = 610      耗时:0
20
F(n) = 6765     耗时:0
30
F(n) = 832040   耗时:0.08
35
F(n) = 9227465  耗时:0.424
40
F(n) = 102334155        耗时:4.33
41
F(n) = 165580141        耗时:6.989
^Z
Aug 24 2016  13:17:07
请按任意键继续. . .

从计算结果中我们可以看到,没有备忘录模式的自顶向下的计算方法是非常耗时的,因为每一次的递归都会有大量的重复计算的过程!

方法二:

带有备忘的自顶向下的方法:
#include<iostream>
#include<algorithm>
#include<ctime>using namespace std;int F2(int n, int *f)
{if (f[n] != -1)return f[n];if (n == 1)return 1;if (n == 2)return 1;f[n] = F2(n - 1, f) + F2(n - 2, f);return f[n];
}int main()
{int n;cout << "请输入n的值:";while (cin >> n){int *f = new int[n + 1];memset(f, -1, sizeof(int)*(n + 1));time_t time1, time2;time1 = clock();long long result = F2(n, f);time2 = clock();cout << "F(n) = " << result << "\t耗时:" << (double)(time2 - time1) / CLOCKS_PER_SEC << endl;free(f);}cout << __DATE__ << "  " << __TIME__ << endl;system("pause");return 0;
}
运算结果:
请输入n的值:10
F(n) = 55       耗时:0
15
F(n) = 610      耗时:020
F(n) = 6765     耗时:0
30
F(n) = 832040   耗时:0
40
F(n) = 102334155        耗时:0
41
F(n) = 165580141        耗时:0
^Z
Aug 24 2016  13:19:43
请按任意键继续. . .

带有备忘的自定向下的方法可以节省大量的时间,因为没有子问题的重复计算!

方法三:

自底向上法:
#include<iostream>
#include<algorithm>
#include<ctime>using namespace std;int F3(int n, int *f)
{f[1] = 1;f[2] = 1;for (int i = 3; i <= n; i++)f[i] = f[i - 1] + f[i - 2];return f[n];
}int main()
{int n;cout << "请输入n的值:";while (cin >> n){int *f = new int[n + 1];memset(f, -1, sizeof(int)*(n + 1));time_t time1, time2;time1 = clock();long long result = F3(n, f);time2 = clock();cout << "F(n) = " << result << "\t耗时:" << (double)(time2 - time1) / CLOCKS_PER_SEC << endl;free(f);}cout << __DATE__ << "  " << __TIME__ << endl;system("pause");return 0;
}

运行结果:

请输入n的值:10
F(n) = 55       耗时:0
15
F(n) = 610      耗时:0
20
F(n) = 6765     耗时:0
25
F(n) = 75025    耗时:0
30
F(n) = 832040   耗时:0
35
F(n) = 9227465  耗时:0
40
F(n) = 102334155        耗时:0
41
F(n) = 165580141        耗时:0
^Z
Aug 24 2016  13:23:16
请按任意键继续. . .

动态规划----费氏数列相关推荐

  1. CC00033.bigdatajava——|Java方法封装.V15|——|Java.v15|费氏数列.v01|递归实现|

    一.费氏数列的递归实现 ### --- 案例题目~~~ --> 编程实现费式数列中第n项的数值并返回. ~~~ --> 费式数列:1 1 2 3 5 8 13 21 -- 二.递归分析 三 ...

  2. CC00034.bigdatajava——|Java方法封装.V16|——|Java.v16|费氏数列.v02|递推实现|

    一.费氏数列的递推实现 ### --- 案例题目~~~ --> 编程实现费式数列中第n项的数值并返回. ~~~ --> 费式数列:1 1 2 3 5 8 13 21 -- 二.递推实现原理 ...

  3. 算法--兔子生兔子的问题(费氏数列)

    #include <stdio.h> int Fib( int n ) {// 说明// Fibonacci 为 1200 年代的欧洲数学家 , 在他的着作中曾经提到 : 「若有一只免子每 ...

  4. Java算法:每对新生兔子第三个月期起生一对兔子(费氏数列)

    题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?    程序分析:   兔子的规律为数列1,1,2, ...

  5. 费氏(Fibonacci)数列、最大公约数,最小公倍数

    费式数列 说明 Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产.起初只有一只免子,一个月后就有两只免子,二个月后有三只免 ...

  6. 费氏搜寻法之算法分析与实现

    费氏搜寻法简介 费氏搜寻法,就是利用斐波那契数列从有序数列中搜寻特定元素的一种搜索算法. 二分搜寻法每次搜寻时,都会将搜寻区间分为一半,所以其搜寻时间为O(log(2)n),log(2)表示以2为底的 ...

  7. C实现 费氏查找算法

    问题引入 费氏数列即斐波那契数列. 斐波那契数列,又称黄金分割数列,数列形式为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,98 ...

  8. 算法——动态规划算法

    动态规划法基本思想:将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解. 著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等. 个人对动态规划的理解,主要就是避免 ...

  9. 斐波那契数列算法(C#)

    上周抽了一天的时间去6家公司面试,时间太紧都是马马虎虎的,好在这趟面试还是有很多收获的,由此可见自己的理论功底真是差劲的要死,还有语言表达能力. 调侃的来说混了这么久,没有衣××的理论功底,只有雷×× ...

  10. 菲波拉契数列(传统兔子问题)

    题目: 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 斐波那契数: 亦称之为斐波那契数列(意大利语: ...

最新文章

  1. ajax post数组对象,Django:ajax POST发送对象数组无法正常工作的数据
  2. 深度盘点Python11个主流框架:Pandas、Django、Matplotlib、Numpy、PyTorch......
  3. matplotlib绘制带比例(percentile)的堆叠(stacked)条形图(bar plot)
  4. JavaEE(14) - JPA关联映射
  5. 车载安卓导航一键root_听说比Carplay牛 率先体验华为HiCar车载互联
  6. UVA 1210 Sum of Consecutive Prime Numbers
  7. python连接数据库的技术_(技术)Python 3 与 pymysql 操作数据库
  8. VMware vSAN 技术详解 | 周末送资料
  9. as安装过程中gradle_电磁阀在安装过程中需注意的一些细节
  10. 数字电路与逻辑设计习题
  11. matlab语法复习
  12. Excel里怎么冻结某一行某一列
  13. 迪杰斯特拉和弗洛伊德算法
  14. Googler在中国的“幸福”生活
  15. 【数电笔记】加法器、减法器
  16. 1.5 极限的存在准则和两个重要极限
  17. Opencv识别面部
  18. B. Luxurious Houses
  19. 和程序员薪酬差不多的工作
  20. SAP VL02N为某个交货单PGI报错说HU和序列号里的标识符不一致问题之对策II

热门文章

  1. Switch分支判断学习心得
  2. 守望先锋为何如此火爆
  3. 最少承诺原则和单一职责原则_单一责任原则
  4. 也评 阿里 P10 赵海平对王垠的面试
  5. Excel数据透视表:查看数据的频率分布
  6. soul软件的简单分析
  7. mysql免安装_mysql免安装版 win10
  8. 软件著作权申报中60页标准代码文档
  9. 1.3.1 互联网的边缘部分(资源子网)
  10. Scratch(五):Scratch小游戏之超级玛丽