记忆化搜索 dfs

Q1   198. 打家劫舍

解法一:

知识点:记忆化搜索=递归搜索+保留计算结果

递归部分:

这样写能够完成上述题目,但是会超时,因为时间复杂度是质数级别,这时候就需要改进代码,也就是保留结果

Cache

或者

class Solution:
    def rob(self, nums: List[int]) -> int:
        n=len(nums)
        @cache
        def dfs(n):
            if n<0:
                return 0
            res=max(dfs(n-1),dfs(n-2)+nums[n])
            return res
        return dfs(n-1)

       

简单解释一下,这里就运用了cache,起初全设置为-1,在进入dfs函数之后首先我们会判断这个dfs之前有没有调用过,也就是有没有保存过计算后的值,如果有,那么直接用,如果没有责在res计算后将其数值记到cache中,以便后续使用,这时候时间,空间复杂度都是n

修改后的代码:

此时复杂度还是n

优化:

升级版(记忆化搜索

代码:

优化:首先进入dfs之前就将三种方式都计算一遍,将得到的target值作为参数传入dfs

解释一下res=max(res,dfs(xxx)+1),为什么要把res和后面的对比来选择最大的,我们知道三个if是顺序执行的,在第二个if执行的时候,res的值已经是第一轮if执行完更新后的res了,所以第二个if中的res其实是第一个if执行完成后的if,相对的,第三个if中的res其实是第二个if执行完的if,那么为什么第一个if也要加res=max(res,dfs(xxx)+1)呢?,因为第一个if也要进入dfs的三个if,同样要通过比较三个if的res来筛选出最大的res

  • 14
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值