动态规划-008-跳台阶

跳台阶问题

题目描述

一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

分析

完全同 Fibonacci 数列

确定状态转移公式

阶段定义:跳n阶台阶需要总可能跳法为 f(n)。

那调到第n阶台阶的最后一步跳法无非是从第n-1阶台阶跳一步上去的,或者从第n-2阶台阶跳两阶上去的。即得状态转移公式:

f(n)=f(n1)+f(n2)f(n) = f(n-1)+f(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)。

f(n)=f(n1)+f(n2)+......+f(2)+f(1)+1f(n) = f(n-1)+f(n-2)+......+f(2)+f(1)+1
         =21(f(n2)+......+f(2)+f(1)+1)~~~~~~~~~=2^1(f(n-2)+......+f(2)+f(1)+1)
         =22(f(n3)+......+f(2)+f(1)+1)~~~~~~~~~=2^2(f(n-3)+......+f(2)+f(1)+1)
         =......~~~~~~~~~=......
         =2(n3)(f(2)+f(1)+1)~~~~~~~~~=2^{(n-3)}(f(2)+f(1)+1)
         =2(n3)(2+1+1)~~~~~~~~~=2^{(n-3)}(2+1+1)
         =2(n1)~~~~~~~~~=2^{(n-1)}

代码

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        return pow(2, number-1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章