跳台阶问题
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析
完全同 Fibonacci 数列。
确定状态转移公式
:
阶段定义:跳n阶台阶需要总可能跳法为 f(n)。
那调到第n阶台阶的最后一步跳法无非是从第n-1阶台阶跳一步上去的,或者从第n-2阶台阶跳两阶上去的。即得状态转移公式:
注意
:
动态规划自底向上解决问题时本身需要维护最优表
,但是一维的动态规划
状态转移方程f(n)
状态只与紧接着的前两个状态有关
,所以可以维护一维的最优表替换成
维护两个变量
即可。将空间复杂度降低成常数级
。
代码
# 自底向上
# -*- coding:utf-8 -*-
class Solution:
def __init__(self):
self.dp = []
def jumpFloor(self, number):
self.dp = [0]*number
self.dp[0] = 1
if number == 1:
return 1
self.dp[1] = 2
for i in range(2,number):
self.dp[i] = self.dp[i-1] + self.dp[i-2]
return self.dp[number-1]
变态跳青蛙
题目描述
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
分析
确定状态转移公式
:
阶段定义:跳n阶台阶需要总可能跳法为 f(n)。
代码
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
return pow(2, number-1)