爬楼梯问题【多解法】
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬楼梯问题【多解法】相关的知识,希望对你有一定的参考价值。
参考技术A 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注:n 是一个正整数。
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
在暴力法中,我们将会把所有可能爬的阶数进行组合,也就是 1 和 2 。而在每一步中我们都会继续调用 climbStairs,climbStairs 这个函数模拟爬 1 阶和 2 阶的情形,并返回两个函数的返回值之和。
climbStairs(i,n) = climbStairs(i + 1, n) + climbStairs(i + 2, n)
其中 i 定义了当前阶数,而 n 定义了目标阶数。
在 n=5 时的递归树将是这样的:
在上一种方法中,我们计算每一步的结果时出现了冗余。另一种思路是,我们可以把每一步的结果存储在 memory 数组之中,每当函数再次被调用,我们就直接从 memory 数组返回结果。
在 memory 数组的帮助下,我们得到了一个修复的递归树,其大小减少到 n 。
不难发现,这个问题可以被分解为一些包含最优子结构的子问题,即它的最优解可以从其子问题的最优解来有效地构建,我们可以使用动态规划来解决这一问题。
第 ii 阶可以由以下两种方法得到:
在第 (i-1) 阶后向上爬 1 阶。
在第 (i-2) 阶后向上爬 2 阶。
所以到达第 i 阶的方法总数就是到第 (i−1) 阶和第 (i−2) 阶的方法数之和。
令 dp[i] 表示能到达第 i 阶的方法总数:
dp[i]=dp[i-1]+dp[i-2]
在上述方法中,我们使用 dp 数组,其中 dp[i]=dp[i-1]+dp[i-2]。可以很容易通过分析得出 dp[i] 其实就是第 i 个斐波那契数。
Fib(n)=Fib(n-1)+Fib(n-2)
现在我们必须找出以 1 和 2 作为第一项和第二项的斐波那契数列中的第 n 个数,也就是说 Fib(1)=1 且 Fib(2)=2。
方法 5: Binets 方法
算法
这里有一种有趣的解法,它使用矩阵乘法来得到第 nn 个斐波那契数。矩阵形式如下:
令
按照此方法,第 nn 个斐波那契数可以由 Q n-1 [0,0] 给出。
让我们试着证明一下。
我们可以使用数学归纳法来证明这一方法。易知,该矩阵给出了第 3 项(基本情况)的正确结果。由于
这证明基本情况是成立的。
假设此方法适用于查找第 nn 个斐波那契数,即 F n =Q n-1 [0,0],那么:
现在,我们需要证明在上述两个条件为真的情况下,该方法可以有效找出第 (n+1) 个斐波那契数,即,F n+1 =Q n [0,0]。
证明:
从而, F n+1 =Q n [0,0]。得证。
我们需要为我们的问题做的唯一改动就是将斐波那契数列的初始项修改为 2 和 1 来代替原来的 1 和 0 。或者,另一种方法是使用相同的初始矩阵 Q 并使用 result = Q n [0,0] 得出最后结果。发生这种情况的原因是我们必须使用原斐波那契数列的第 2 项和第 3 项作为初始项。
我们可以使用这一公式来找出第 n 个斐波那契数:
对于给定的问题,斐波那契序列将会被定义为 F 0 = 1,F 1 = 1,F 2 = 2,F n+2 = F n+1 + F n 。尝试解决这一递归公式的标准方法是设出 F n ,其形式为 F n = a n 。然后,自然有 F n+1 = a n+1 和 F n+2 = a n+2 ,所以方程可以写作 a n+2 = a n+1 + a n 。如果我们对整个方程进行约分,可以得到 a 2 = a + 1 或者写成二次方程形式 a 2 - a- 1= 0。
对二次公式求解,我们得到:
一般解采用以下形式:
n = 0时,有A + B = 1
n = 1时,有
解上述等式,我们得到:
将 AA 和 BB 的这些值带入上述的一般解方程中,可以得到:
算法题-爬楼梯
本文来自博客园,作者:烟熏柿子学编程,转载请注明原文链接:https://www.cnblogs.com/aaron-948/p/16226363.html
以上是关于爬楼梯问题【多解法】的主要内容,如果未能解决你的问题,请参考以下文章
力扣(LeetCode) -- 算法第七十题-- 爬楼梯(暴力解法)
力扣(LeetCode) -- 算法第七十题-- 爬楼梯(暴力解法)
力扣(LeetCode) -- 算法第七十题-- 爬楼梯(暴力解法)
leetcode 70. 爬楼梯(Climbing Stairs)