斐波那契数列是最经典的动态规划算法应用实例之一。接下来,将从斐波那契数列入手,学习下基于动态规划求解问题。
问题描述:
斐波那契数列, 是指一个数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,
F(1) = 1,
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给你 n ,请计算 F(n) 。更详细的题目描述和示例可以参考力扣
解题思路:
根据斐波那契数列公式,在数列个数大于2的情况下,后一项的值等于前两项的值的和。也就是说,问题的求解依赖其子问题的求解。显然,这个问题可以使用递归算法解决。但是,也应注意到该递归算法会反复地求解相同的子问题,而不是一直生成新的子问题。而动态规划通过安排问题的求解顺序,确保每个子问题只求解一次(将结果保存起来。如果随后再次需要此子问题的解,只需查找保存的结果,而不必重新计算)。所以,也可以使用动态规划求解该问题。
算法实现:
接下来将分别使用递归算法和动态规划算法求解该问题。

朴素递归算法

由于已知知道递推公式,所以可以直接基于递推公式实现算法。对应代码如下:

public int fibInRecursion(int n) {if (n < 2) {return n;}return fibInRecursion(n - 1) + fibInRecursion(n - 2);
}

动态规划算法

根据斐波那契数列公式,在数列个数大于2的情况下,后一项的值等于前两项的值的和。由于该公式需要反复地求解相同的子问题,所以可以使用动态规划算法减少重复子问题的求解。
在明确可以使用动态规划后,接下来考虑如何实现相关算法。动态规划有两种等价实现方法:带备忘的自顶向下法自底向上法。两种方法得到的算法具有相同的渐近运行时间,仅有的差异是在某些特殊情况下,自顶向下方法并未真正递归地考察所有可能的子问题。由于没有频繁的递归函数调用的开销,自底向上方法的时间复杂性函数通常具有更小的系数。由于对于该问题,其子问题空间中所有子问题都需求解,所以采用自底向上方法(减少递归调用的开销)。明确了算法实现方法选择后,接下来考虑实现。

public int fibInDynamicProgramming(int n) {if (n < 2) {return n;}// 暂存中间结果int first = 0;int second = 1;int result = first + second;for (int i = 2; i <= n; i++) {result = first + second;first = second;second = result;}return result;
}

可以看到,直接使用递归算法,其最坏时间复杂度是O(2n)O(2^n)O(2n),而使用动态规划算法,其最坏时间复杂度是O(n)O(n)O(n),所需消耗的空间也是在常量范围内。
类似的题目还有: (1) 爬楼梯问题,(2) 使用最小花费爬楼梯问题 ,(3) 不同路径问题 。

参考

https://leetcode-cn.com/problems/fibonacci-number/ 斐波那契数列
https://leetcode-cn.com/problems/climbing-stairs/ 爬楼梯问题
https://leetcode-cn.com/problems/min-cost-climbing-stairs/ 使用最小花费爬楼梯
https://leetcode-cn.com/problems/unique-paths/ 不同路径

动态规划实战篇--斐波那契数列相关推荐

  1. 【算法】【递归与动态规划模块】斐波那契数列的系列问题解法及递推类型问题的最优解

    目录 前言 问题介绍 解决方案 代码编写 java语言版本 c语言版本 c++语言版本 思考感悟 写在最后 前言 当前所有算法都使用测试用例运行过,但是不保证100%的测试用例,如果存在问题务必联系批 ...

  2. 427-动态规划算法-斐波那契数列

    动态规划算法求解斐波那契数列 状态:dp数组,存储已经求解的子问题的最优解 递归版本的动态规划算法 //参数n表示斐波那契数列中数字的个数. //返回相应个数的斐波那契数列数字的值. int fabn ...

  3. Python代码实战(初级篇)————7、斐波那契数列

    题目要求 使用python实现斐波那契数列 题目分析 斐波那契数列有这样的规律: 题目代码实现 方法一: def fib(n):a, b = 1, 1for i in range(n - 1):a, ...

  4. 八十八、从斐波那契数列和零一背包问题探究动态规划

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 本人看了vivo,阿里巴巴的校招算法题,可以明确知道绝对有动态规划. ...

  5. 每周一刷——从斐波那契数列到动态规划

    一写在前面的话 二普通版 三改进版 四动态规划版 一.写在前面的话 在csdn上看到一篇博客,博客的内容有有关图像方面的paper,有有关机器学习的理论推导和python实践,文风简洁而不拖沓,非常喜 ...

  6. 笔试题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。该题有三种解法:递归的方法求解斐波那契数列、用概率与统计的数学方法解决,3.动态规划

    笔试题 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法.该题有三种解法:1.递归的方法求解斐波那契数列.2.用概率与统计的数学方法解决,3.动态规划 ...

  7. 用C语言写爬楼梯(斐波那契数列的应用,迭代与递归)爬楼梯问题超详细,看完这一篇就够了。

    爬楼梯问题实际上就是斐波那契数列的应用,首先我们讲讲什么是斐波那契数列.因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列" ...

  8. 斐波那契数列的实现(简单递归和动态规划)

    斐波那契数列的实现(简单递归和动态规划) 一.简单递归的实现 1 #include "stdafx.h" 2 #include <string> 3 using nam ...

  9. 动态规划实现斐波那契数列求解

    int fibonacciDP1(int n) { // 动态规划不使用数组int a = 0;int b = 1;int sum;int i;if (n == 0)return 0;if (n == ...

  10. Python 实现 动态规划 /斐波那契数列

    1.斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为&quo ...

最新文章

  1. 计组(唐朔飞)第一章自我总结
  2. 实现滚到div时淡入效果
  3. Jsp2.0自定义标签(第二天)——自定义循环标签
  4. WinCE系统的编译过程详解
  5. 铜陵高考2021年成绩查询,滁州高考成绩查询入口2021
  6. 在单用户模式下启动SQL Server的不同方法
  7. Java面试八股文 2021年最新Java面试题及答案汇总
  8. 51单片机驱动LCD12864中文字库显示
  9. 海森矩阵的特征值和特征向量的物理意义推导
  10. 离散时间傅里叶变换(一)
  11. 如何买到便宜点的书(知乎)
  12. mysql拼图游戏代码_HTML+Javascript制作拼图小游戏详解(二)
  13. YYC松鼠短视频系统v3.5版本--稳定版本---优化性能以及各处接口返回以及部分ui页面细节
  14. GII全球创新指数(2011-2018年)
  15. Preserving Prefix Integrity
  16. matlab导入表格画图,matlab从excel表格导入数据画图-在matlab上如何导入excel表格然后画图...
  17. uva 11595 - Crossing Streets EXTREME(切割多边形)
  18. python pickle文件大小_无法在Python中加载以前转储的大大小pickle文件
  19. 2022IYPT/CUPT第十一题 旋风球(橡皮筋上的球)
  20. 工厂生产设备维修管理系统软件

热门文章

  1. 易筋SpringBoot 2.1 | 第三十四篇:Spring Boot导出war包部署到外部Tomcat
  2. Sourcetree 看不了文件内容 Diff was suppressed because of file size or pattern
  3. verdi中波形怎么看间距_热血传奇:怎么看传奇中的“首充”?
  4. AS 更新项目gradle方法
  5. libsvm python Linux Ubuntu下编程操作实践
  6. 工控安全| 西门子S7-300攻击分析
  7. 《Web漏洞防护》读书笔记——第3章,其他注入防护
  8. 河海大学文天学院计算机科学与技术,河海大学文天学院计算机科学与技术2010级软件工程试卷...
  9. springboot maven父项目脚手架
  10. Tomcat8+redis实现session共享