斐波那契数列及简单dp应用

斐波那契数

  • 问题:现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项 是1)。 n<=39

  • 解决:

    #方法一:迭代
    class Solution:
        def fib(self, N: int) -> int:
            if N < 2:
                return N
            first = 0
            second = 1
            third = 1
            while( N>=2):
                third = first + second
                first , second = second, third
                N -= 1
            return third
    #方法二:递归
    class Solution:
        def fib(self, N: int) -> int:
            if N < 2:
                return N
            return self.fib(N-1) + self.fib(N-2)
    #方法三:递归,剪枝减少重复计算
    class Solution:
        def fib(self, N: int) -> int:
            if N <= 1:
                return N
            # self.cache = {}
            # if N-1 in self.cache.keys():
            #     pre = self.cache[N-1]
            # else:
            #     pre = self.fib(N-1)
            #     self.cache[N-1] = pre
            # if N-2 in self.cache.keys():
            #     ppre = self.cache[N-2]
            # else:
            #     ppre = self.fib(N-2)
            #     self.cache[N-2] = ppre
            # return pre + ppre
            self.cache = {0:0,1:1}
            return self.filter(N)
        def filter(self, N: int) -> int:
            if N in self.cache.keys():
                return self.cache[N]
            self.cache[N] = self.filter(N-1)+self.filter(N-2)
            return self.filter(N)
    
  • 问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。

  • 解决:

    #动态规划dp
    #1.定义状态:f(n):青蛙跳上第n级台阶的总跳法
    #2.转移方程:f(n) = f(n+1) + f(n+2)
    #3.设置初始值:f(0) = 1 , f(1) = 1, f(2) = 2
    class Solution:
        def jumpFloor(self, number):
            if number <= 1:
                return 1
            dp = {0:1, 1:1}
            for i in range(2,number+1):
                dp[i] = dp[i-1] + dp[i-2]
            return dp[number]
    
posted @ 2020-07-23 18:45  guguda  阅读(303)  评论(0)    收藏  举报