dp训练题

对于进击的青蛙的算法训练,可以提供一些思路和解法: 问描述:有一只青蛙在跳台阶,它一次可以跳1个台阶或者2个台阶。请问,对于给定的n个台阶,青蛙有多少种跳法可以跳到第n个台阶上? 解法一:递归 青蛙跳到第n个台阶上的跳法数量,可以看成是青蛙从第n-1个台阶跳一步到达的跳法数量加上青蛙从第n-2个台阶跳两步到达的跳法数量,即f(n) = f(n-1) + f(n-2)。 使用递归的方式,可以编写如下的算法: ```python def jump(n): if n <= 2: return n else: return jump(n-1) + jump(n-2) ``` 这种方法虽然直观简单,但是存在大量的重复计算,效率较低。 解法二:动态规划 为了避免重复计算,可以使用动态规划的思想来解决问。通过一个数组dp来保存中间结果,dp[i]表示青蛙跳到第i个台阶上的跳法数量。 初始条件为dp = 0,dp = 1,dp = 2。然后通过迭代计算出dp[i]的值,最后返回dp[n]即可。 具体的算法如下: ```python def jump(n): if n <= 2: return n dp = [0] * (n+1) dp[1] = 1 dp[2] = 2 for i in range(3, n+1): dp[i] = dp[i-1] + dp[i-2] return dp[n] ``` 这种方法时间复杂度为O(n),空间复杂度也为O(n)。 解法三:优化的动态规划 可以发现,解法二中的动态规划算法实际上只需要用到了三个变量,因此可以进一步优化空间复杂度。 具体的算法如下: ```python def jump(n): if n <= 2: return n a, b, c = 1, 2, 0 for i in range(3, n+1): c = a + b a, b = b, c return c ``` 这种方法的时间复杂度仍然为O(n),但是空间复杂度为O(1)。 以上就是几种解决进击的青蛙问算法训练方法,希望对你有帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值