当前位置: 首页 > news >正文

【Python 算法】动态规划

本博客笔记内容来源于灵神,视频链接如下:https://www.bilibili.com/video/BV16Y411v7Y6?vd_source=7414087e971fef9431117e44d8ba61a7&spm_id_from=333.788.player.switch

01背包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

计算了f[i+1],f[i]就没用了,相当于每时每刻只有两个数组在参与运算:
在这里插入图片描述
在这里插入图片描述
494题是求方案数的,要初始化成 0。
如果是恰好型背包并且要计算最大最小,那么初始值就和 inf 有关。

力扣494题:

在这里插入图片描述

对于至少/至多的变形问题,变形类似:

在这里插入图片描述

在这里插入图片描述

完全背包

在这里插入图片描述
在这里插入图片描述
力扣322题:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

其中:从二维递推式来理解,
例如01背包,更新f【c】的值需要的是当前f【c】和上一个状态的f【c-w】,因为我们现在之后一个数组,若是正序,f【c-w】就更新过了,也就不是上一个状态的值了,所以必须逆序
若是完全背包,更新f【c】的值需要的是当前f【c】和当前状态的f【c-w】,需要的就是更新过的值,所以正序是没问题的。

例题:力扣2915. 和为目标值的最长子序列的长度

在这里插入图片描述

class Solution:
    def lengthOfLongestSubsequence(self, nums: List[int], target: int) -> int:
        # 先使用递归
        # 恰好等于target ==背包容量
        # 长度即选物品,其价值为1
        # 只能选一次:01背包问题
        n = len(nums)

        # 1.递归:
        @cache
        def dfs(i,c):
            if i<0:
                return 0 if c==0 else -inf
            if c< nums[i]:
                return dfs(i-1,c)
            return max(dfs(i-1,c),dfs(i-1,c-nums[i])+1)
        
        ans= dfs(n-1,target)
        dfs.cache_clear()
        return ans if ans>-1 else -1

        # 2. 转为递推:
        dp[i+1][c]= max(dp[i][c],dp[i][c-nums[i]]+1) 整体加了1
        dp =[[-inf]*(target+1) for _ in range(n+1)]
        dp[0][0]=0
        for i,x in enumerate(nums):
            for c in range(target+1):
                if c<x:
                    dp[i+1][c]=dp[i][c]
                else:
                    dp[i+1][c]= max(dp[i][c],dp[i][c-x]+1)
        ans = dp[n][target]
        return ans if ans>-1 else -1

        # 3. 进一步优化为滚动数组
        dp =[[-inf]*(target+1) for _ in range(2)]
        dp[0][0]=0
        for i,x in enumerate(nums):
            for c in range(target+1):
                if c<x:
                    dp[(i+1)%2][c]=dp[i%2][c]
                else:
                    dp[(i+1)%2][c]= max(dp[i%2][c],dp[i%2][c-x]+1)

        ans = dp[n%2][target]  # 记得这里也要%2
        return ans if ans>-1 else -1

        #  4. 进一步优化为1维滚动数组

        dp =[-inf]*(target+1)
        dp[0]=0
        for x in nums:
            for c in range(target,x-1,-1):
                if c<x:
                    dp[c] = dp[c]
                else:
                    dp[c]= max(dp[c],dp[c-x]+1)

        ans = dp[target]  
        return ans if ans>-1 else -1

        

相关文章:

  • 【Kubernetes】CentOS 7 安装 Kubernetes 1.30.1
  • CCCC天梯赛L1-094 剪切粘贴
  • 进程原理以及系统调用
  • 设计与实现高性能安全TOKEN系统
  • 【YOLOv8】YOLOv8改进系列(11)----替换主干网络之MobileNetV4
  • kubernetes》》k8s》》 kubeadm、kubectl、kubelet 重启pod
  • 【力扣hot100题】(029)两两交换链表中的节点
  • 【详细解释第三部分:方法的使用【java版本详细】】
  • 从代码学习深度学习 - 稠密连接网络(DenseNet)PyTorch版
  • 装饰器模式与模板方法模式实现MyBatis-Plus QueryWrapper 扩展
  • Flink SQL Client bug ---datagen connector
  • 动态规划(11.按摩师)
  • Opencv计算机视觉编程攻略-第五节 用形态学运算变换图像
  • Git团队开发命令总结
  • 数字人训练数据修正解释
  • java 并发编程-ReentrantLock
  • python识别扫描版PDF文件,获取扫描版PDF文件的文本内容
  • 二叉树搜索树与双向链表
  • hackmyvm-flossy
  • AWS用Glue读取S3文件上传数据到Redshift,再导出到Quicksight完整版,含VPC配置
  • 云南 网站建立/淘宝客推广一天80单
  • 介绍自己的家乡遵义网站建设/微信推广方法
  • 分栏型网站/推广网站怎么制作
  • 陕西专业网站建设公司/济南seo公司报价
  • 建造师官网/seo技术分享免费咨询
  • 摄影设计师招聘/seo排名点击软件