leetcode——动态规划——70

最经典的爬台阶问题
在这里插入图片描述

递归树的思路:
在这里插入图片描述
红色的有重复计算,所以用空间换时间的思想来优化递归。

# -*- encoding: utf-8 -*-

class Solution:
    """对于递归树来说,使用纯递归的方法,O(n)=2^n,有重复计算的情况"""
    def stairs_climbing(self, n: int) -> int:
        if n == 2: return 2
        if n == 1: return 1
        return self.stairs_climbing(n - 1) + self.stairs_climbing(n - 2)

    def climbStairs(self, n: int) -> int:
        return self.stairs_climbing(n)


class Solution2:
    """使用了一个全局变量用来存储算过的值,从上到下的递归方法,
	这里还有一个不太好理解的地方是当有0个台阶时,没法走,也算是一种方法。
	"""
    def stairs_climbing(self, n: int) -> int:
        if self.memo[n] == 0:
            self.memo[n] = self.stairs_climbing(n - 1) + self.stairs_climbing(n - 2)
        return self.memo[n]

    def climbStairs(self, n: int) -> int:
        self.memo = [0] * (n + 1)
        self.memo[0], self.memo[1] = 1, 1
        return self.stairs_climbing(n)


class Solution3:
    """同样使用一个全局变量来存储计算过的值,不过是从下到上的方法,不用递归"""
    def climbStairs(self, n: int) -> int:
        memo = [0] * (n + 1)
        memo[0], memo[1] = 1, 1
        if memo[n] == 0:
            for i in range(2, n + 1):
                memo[i] = memo[i - 1] + memo[i - 2]
        return memo[n]


if __name__ == '__main__':
    solution = Solution3()
    rest = solution.climbStairs(100)
    print(rest)

那到底什么是动态规划呢?
可以把复杂问题分解为子问题,并且子问题还可以优化。
当然这里还涉及到两种思想,分别是

  • 从上到下的思考问题(使用递归)
  • 从下到上的实现(可以不使用递归)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值