动态规划----费氏数列
我们熟悉的费氏数列也是典型的动态规划的问题。
方法一:
#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
请按任意键继续. . .
动态规划----费氏数列相关推荐
- CC00033.bigdatajava——|Java方法封装.V15|——|Java.v15|费氏数列.v01|递归实现|
一.费氏数列的递归实现 ### --- 案例题目~~~ --> 编程实现费式数列中第n项的数值并返回. ~~~ --> 费式数列:1 1 2 3 5 8 13 21 -- 二.递归分析 三 ...
- CC00034.bigdatajava——|Java方法封装.V16|——|Java.v16|费氏数列.v02|递推实现|
一.费氏数列的递推实现 ### --- 案例题目~~~ --> 编程实现费式数列中第n项的数值并返回. ~~~ --> 费式数列:1 1 2 3 5 8 13 21 -- 二.递推实现原理 ...
- 算法--兔子生兔子的问题(费氏数列)
#include <stdio.h> int Fib( int n ) {// 说明// Fibonacci 为 1200 年代的欧洲数学家 , 在他的着作中曾经提到 : 「若有一只免子每 ...
- Java算法:每对新生兔子第三个月期起生一对兔子(费氏数列)
题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 程序分析: 兔子的规律为数列1,1,2, ...
- 费氏(Fibonacci)数列、最大公约数,最小公倍数
费式数列 说明 Fibonacci为1200年代的欧洲数学家,在他的着作中曾经提到:「若有一只免子每个月生一只小免子,一个月后小免子也开始生产.起初只有一只免子,一个月后就有两只免子,二个月后有三只免 ...
- 费氏搜寻法之算法分析与实现
费氏搜寻法简介 费氏搜寻法,就是利用斐波那契数列从有序数列中搜寻特定元素的一种搜索算法. 二分搜寻法每次搜寻时,都会将搜寻区间分为一半,所以其搜寻时间为O(log(2)n),log(2)表示以2为底的 ...
- C实现 费氏查找算法
问题引入 费氏数列即斐波那契数列. 斐波那契数列,又称黄金分割数列,数列形式为:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,98 ...
- 算法——动态规划算法
动态规划法基本思想:将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解. 著名的应用实例有:求解最短路径问题,背包问题,项目管理,网络流优化等. 个人对动态规划的理解,主要就是避免 ...
- 斐波那契数列算法(C#)
上周抽了一天的时间去6家公司面试,时间太紧都是马马虎虎的,好在这趟面试还是有很多收获的,由此可见自己的理论功底真是差劲的要死,还有语言表达能力. 调侃的来说混了这么久,没有衣××的理论功底,只有雷×× ...
- 菲波拉契数列(传统兔子问题)
题目: 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 斐波那契数: 亦称之为斐波那契数列(意大利语: ...
最新文章
- ajax post数组对象,Django:ajax POST发送对象数组无法正常工作的数据
- 深度盘点Python11个主流框架:Pandas、Django、Matplotlib、Numpy、PyTorch......
- matplotlib绘制带比例(percentile)的堆叠(stacked)条形图(bar plot)
- JavaEE(14) - JPA关联映射
- 车载安卓导航一键root_听说比Carplay牛 率先体验华为HiCar车载互联
- UVA 1210 Sum of Consecutive Prime Numbers
- python连接数据库的技术_(技术)Python 3 与 pymysql 操作数据库
- VMware vSAN 技术详解 | 周末送资料
- as安装过程中gradle_电磁阀在安装过程中需注意的一些细节
- 数字电路与逻辑设计习题
- matlab语法复习
- Excel里怎么冻结某一行某一列
- 迪杰斯特拉和弗洛伊德算法
- Googler在中国的“幸福”生活
- 【数电笔记】加法器、减法器
- 1.5 极限的存在准则和两个重要极限
- Opencv识别面部
- B. Luxurious Houses
- 和程序员薪酬差不多的工作
- SAP VL02N为某个交货单PGI报错说HU和序列号里的标识符不一致问题之对策II