| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> DP求解 斐波那契数列 、青蛙跳台阶 -> 正文阅读 |
|
[数据结构与算法]DP求解 斐波那契数列 、青蛙跳台阶 |
DP求解 斐波那契数列 、青蛙跳台阶1. 斐波那契数列
1. 递归求解求解斐波那契数列 相信之前大多数人会都使用递归来求解,如下所示
但是我们如果将递归展开,将会发现,递归求解中做了很多重复的工作,如下所示:我们如果要递归求解5,那么将会有很多重复的计算(下图中颜色相同的节点),那么我们该怎么优化呢? 2. 记忆化递归法? 最好的办法就是,在递归法的基础上,建立一个数组,用于存储fib(0) 至 fib(n)的计算结果,如果遇到相同的数字就可以不必计算,直接从数组取用,避免了重复的递归计算。 代码如下:
3. 动态规划但是记忆化递归需要使用O(N)的额外空间,所以我们继续分析,进行优化 由于 F(N) = F(N - 1) + F(N - 2), 其中 N > 1. 我们发现,第N项只与第N-1项和第N-2项有关,所以我们只需要三个变量a,b,temp,使用辅助变量temp使a,b两个数字交替前进,这样的话空间复杂度将会减少到O(1); 代码如下所示
4. 大数越界问题随着 n的 增大, fib(n) 会可能会超过int甚至是long的取值范围,导致最终的返回值错,所以我们还需要继续优化
根据上面这个规则,我们可以推出:fib**(n)⊙p=[fib(n-1)⊙p + fib(n-2)**]⊙p,从而在计算中循环计算temp = (a + b) ⊙1000000007即可 如下所示:
2. 青蛙跳台阶
分析:由于青蛙一次只有两种选择,跳上1级台阶和可以跳上2级台阶,那么假设现在有n级台阶,共有f(n)种跳法。那么在最后一步只有两种情况:
初始情况下 f(0) = 1,没有台阶的话原地跳 f(1) = 1 只有一个台阶的时候,只能跳 1 级 f(2) = 2 有两个台阶的时候,可以选择连续跳两次一次跳一级,也可以一次跳两级 综上,f(n) = f(n-1) + f(n-2) 分析后我们发现,这个和斐波那契数列几乎一样,只是初始值f(0)不同(斐波那契数列为0,青蛙跳台阶为1),所以我们直接使用动态规划法,代码如下
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:33:51- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |