day46-动态规划8-单词拆分问题

news2024/11/18 9:40:03

139.单词拆分-完全背包问题区分求组合数和排列数

在这里插入图片描述
本题可以使用回溯算法进行暴力搜索,但是如何使用动态规划的思路进行求解呢。将字符串可以理解成一个容器,将单词可以当成物品,那么此时问题转化成利用物品能否装满容器的问题。这个时候由于返回的是True或者False,所以在搜索过程中需要将dp数组赋值成True或者False。
动归五步曲:

  1. dp[i]:长度为i的子串是否能被字典中的单词所组成。
  2. dp[0]=True
  3. 递推公式: dp[i] = dp[i] or dp[i-len(j)] and (s[i-len(j):i]==j),看当前状态是否用字典中的字符串进行表示。
  4. 遍历方式:
  5. 打印dp数组

思考:
返回什么结果那么dp数组的返回值就要设置成什么结果。

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        # 转化成背包问题就是,单词的排列问题,单词的整体长度记作背包的承载重量
        # 长度为i的背包,可以用字典中的单词进行拆分。
        target = len(s)
        dp = [False] * (target + 1) #i的背包有几种装物品的方式
        dp[0] = True
        for i in range(1,target+1):
            for j in wordDict:
                if i >= len(j):
                    dp[i] = dp[i] or dp[i-len(j)] and (s[i-len(j):i]==j)
        return dp[target]

多重背包问题-理论基础

多重背包定义:
有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。

多重背包非常类似于0-1背包:
每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。

能在0-1背包问题的基础上,把多重背包的逻辑实现即可。

背包问题总结

总结来自于代码随想录

背包递推公式

问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
动态规划:416.分割等和子集(opens new window)
动态规划:1049.最后一块石头的重量 II(opens new window)
问装满背包有几种方法:dp[j] += dp[j - nums[i]] ,对应题目如下:
动态规划:494.目标和(opens new window)
动态规划:518. 零钱兑换 II(opens new window)
动态规划:377.组合总和Ⅳ(opens new window)
动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)
问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]); ,对应题目如下:
动态规划:474.一和零(opens new window)
问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]); ,对应题目如下:
动态规划:322.零钱兑换(opens new window)
动态规划:279.完全平方数(opens new window)

01背包

在动态规划:关于01背包问题,你该了解这些! (opens new window)中我们讲解二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
和动态规划:关于01背包问题,你该了解这些!(滚动数组) (opens new window)中,我们讲解一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。

一维dp数组的背包在遍历顺序上和二维dp数组实现的01背包其实是有很大差异的,大家需要注意!

完全背包

如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。

相关题目如下:
求组合数:动态规划:518.零钱兑换II(opens new window)
求排列数:动态规划:377. 组合总和 Ⅳ (opens new window)、动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)
如果求最小数,那么两层for循环的先后顺序就无所谓了,相关题目如下:
求最小数:动态规划:322. 零钱兑换 (opens new window)、动态规划:279.完全平方数(opens new window)
对于背包问题,其实递推公式算是容易的,难是难在遍历顺序上,如果把遍历顺序搞透,才算是真正理解了。

198.打家劫舍

在这里插入图片描述

思考该问题的求解思路: 当前偷或者不偷的状态受到哪些状态的影响,如何利用这些状态建立递推关系。当前状态和前面状态会有一种依赖关系,那么这种依赖关系都是动规的递推公式。

动归五步曲:

  1. dp数组含义(结合问题求的结果是什么): dp[i]考虑下标i则能够偷到的最大的钱币。
  2. 递推公式:偷i的话 dp[i-2]+coin[i],不偷i-1 dp[i-1],dp数组的含义表示i之前能够得到的最大金币数。
  3. 初始化dp数组:dp[0] = nums[0],dp[1] = max(nums[1],nums[0])
  4. 遍历顺序
  5. 打印dp数组
class Solution:
    def rob(self, nums: List[int]) -> int:
        '''
        定义子问题:如何将原问题划分成一个一个的子问题,子问题就是对之前问题的解决,所以可以不用关注子问题,把注意力集中在此后问题的求解上
        写出子问题的递推关系
        确定 DP 数组的计算顺序'''
        N = len(nums)
        if N == 0:
            return 0
        if N == 1:
            return sum(nums)
        dp = [0]*(N+1)
        dp[0] = 0
        dp[1] = nums[0]
        for k in range(2,N+1):
            dp[k] = max(dp[k-1],dp[k-2]+nums[k-1])
        return dp[N]

213 打家劫舍II

由于线性数组出现了首尾相接的形式,为了解决该问题将线性数组进行拆分即可。先考虑前四个,再考虑后四个值,这样的话就可以对原始的数组进行拆分,在求解两个部分的最大值,即得到整体的最大值。主要思想就是让首尾元素不会相互影响。

class Solution:
    def traversal(self,nums):
        N = len(nums)
        if N == 0:
            return 0
        if N == 1:
            return sum(nums)
        dp = [0] * N
        dp[0] = nums[0]
        dp[1] = max(nums[0],nums[1])
        for k in range(2,N):
            dp[k] = max(dp[k-1],dp[k-2]+nums[k])
        return dp[N-1]
        
    def rob(self, nums: List[int]) -> int:
        # 线性数组连成环,首尾相连,在这个环中偷的最大金币是多少。
        if len(nums) == 1:
            return nums[0]
        n = len(nums)
        left = self.traversal(nums[0:n-1])
        right = self.traversal(nums[1:n])
        return max(left,right)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604413.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python列表框-理解列表框的功能和用途

Python列表框 -理解列表框的功能和用途 列表框可以说是Python编程中最常用的控件之一。列表框用于在桌面应用程序中显示和管理数据。与其他编程语言一样,Python编程语言提供了许多列表框控件,可以使用它们来管理和显示各种数据。 列表框是一种视觉化的…

软件工程导论(5)软件编码测试与维护

一、软件编程 2.1良好的编程习惯 变量命名有意义并且使用统一的命名规则 编写自文档代码(序言性注释 or 行内注释) 提前进行可维护性考量(可以用常量的方式存在的数值最好以变量的方式存在) 良好的视觉安排可以提高代码的可读性(…

【服务器】零基础搭建私有云盘并内网穿透远程访问

文章目录 摘要视频教程1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 转载自cpolar极点云的文章:使用Nextcl…

Hx711称重模块+STM32+CubeMX

文章目录 一、模块和接线二、CubeMX配置1.时钟及sys2.IO口1)数据线DT设置为Input2)时钟线SCK设置为Output 3.串口4.后续配置 三、程序1.main.c2.hx711.c3.hx711.h4.串口重定向 总结参考文章 提示:以下是本篇文章正文内容,下面案例…

【消息中间件】比较Redis,Kafka和RabbitMQ

对微服务使用异步通信时,通常使用消息代理。代理确保不同微服务之间的通信可靠且稳定,消息在系统内得到管理和监控,并且消息不会丢失。您可以从几个消息代理中进行选择,它们的规模和数据功能各不相同。这篇博文将比较三种最受欢迎…

云服务器CPU内存/带宽配置怎么选择?

云服务器配置怎么选择?个人如何选择?企业怎么选择云服务器配置?腾讯云服务器CPU内存、带宽和系统盘怎么选择合适?个人用户可以选择轻量应用服务器,企业用户可以选择云服务器CVM,企业用户可以选择标准型S5云…

5.1 树和二叉树的定义

博主简介:一个爱打游戏的计算机专业学生博主主页: 夏驰和徐策所属专栏:算法设计与分析 5.1.1 树的定义 我的理解: 在计算机科学中,树是一种非线性数据结构,由节点(或称为顶点)和边…

ChatGPT国内镜像网站大盘点(国内可用免费GPT-3.5或GPT-4镜像站点)

目录 方法1:使用灵动Ai Chat网页版 方法2:使用AI CHATGPT 公益站 方法3:使用Chat8 方法4:使用https://steamship.com 方法5:使用AI文本工具站 方法6:使用AIDuTu 很多网友想要国内可用免费ChatGPT镜像站…

【AI实战】开源且可商用的 40B 大语言模型 Falcon 40B

【AI实战】开源且可商用的 40B 大语言模型 Falcon 40B Falcon 40B 介绍开源地址Falcon 40B 的测评开源协议 Falcon 40B 介绍 官网 https://www.tii.ae/news/uaes-technology-innovation-institute-launches-open-source-falcon-40b-large-language-model Abu Dhabi-UAE: 25 Ma…

spring cloud搭建(hystrix)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

安装指定版本docker [centos]

在安装k8s时,对其docker版本有要求,因为在v1.4后对docker不再支持。在安装v1.36版本时,需要提前安装对应版本的docker,这里安装20.10版本 一 先卸载原来安装的docker yum remove docker-ce docker-ce-cli containerd.io 再删除对…

vivado中的Video timing controller IP核参数计算方法

一、参数的计算 直入正题,已知某一1024*600的LCD屏幕,屏幕参数大致如下: 如何设置IP核配置界面的参数呢? 细调参数几乎用不到,我们主要说一下水平设置和垂直设置的8个参数如何配置。取LCD屏幕的典型值作为参考值&#…

自动驾驶之行泊一体

行泊一体技术是一种集成了自动泊车和无人驾驶技术的新型汽车技术,该技术可以使汽车更加智能化和自动化,提高驾驶的安全性和便捷性。从芯片和BEV技术门槛方面来看,我们可以更好地理解这项技术的优势和挑战。 一、芯片限制 实现行泊一体技术需要依靠一些关键的芯片技术,其…

谷歌浏览器Software Reporter Tool长时间占用CPU解决办法

如下图所示,大家是否在使用谷歌浏览器的过程中发现CPU风扇狂转,打开任务管理器发现一个名为software_reporter_tool.exe的软件占用了一半的CPU资源!这简直不能忍,按照下面教程,可以解决这个令人苦恼的问题。 什么是Sof…

【LeetCode】693. 交替位二进制数

693. 交替位二进制数(简单) 方法一 思路 如果一个数的二进制表示总是 0、1 交替出现,那么这个数字可能有两种表示情况,...101010 或 ...010101 ,即对应最低位从 0 或 1 开始的两种情况。 因此,我们先确定…

港科夜闻|香港科大出席一流大学建设系列研讨会-2022暨中国大学校长联谊会...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大出席一流大学建设系列研讨会—2022暨中国大学校长联谊会。5月25日至26日,香港科技大学副校长汪扬教授出席由中国科学技术大学主办的一流大学建设系列研讨会—2022暨中国大学校长联谊会。参会代表来自…

【SpringCloud】SpringAMQP总结

文章目录 1、AMQP2、基本消息模型队列3、WorkQueue模型4、发布订阅模型5、发布订阅-Fanout Exchange6、发布订阅-DirectExchange7、发布订阅-TopicExchange8、消息转换器 1、AMQP Advanced Message Queuing Protocol,高级消息队列协议。是用于在应用程序之间传递业务…

深入理解设计原则之单一职责原则(SRP)

系列文章目录 C高性能优化编程系列 深入理解设计原则系列 深入理解设计模式系列 高级C并发线程编程 SRP:单一职责原则 系列文章目录1、单一职责原则的定义和解读2、单一职责原则案例解读2.1、违背单一职责原则反面案例2.2、违背单一职责原则反面案例 - 解决方案 3…

《嵌入式存储器架构、电路与应用》----学习记录(三)

第4章 嵌入式内存 4.1 Flash的发展背景 Flash是非易失存储器,具有存储密度高、容错能力强和读写速度相对较慢等特点,传统Flash广泛应用于外部大数据存储。为了满足微控制器芯片(MCU)高速运算的需求,嵌入式Flash(eFlash)往往作为MCU的内部数…

【花雕学AI】ChatGPT的四大语言处理神器:文本生成、问答、创意生成和内容优化的技巧和实例

引言:ChatGPT是一个人工智能聊天机器人,它可以理解和交流多种语言,例如中文、英文、日文、西班牙语、法语、德语等。它是由OpenAI开发的,基于GPT-3.5和GPT-4这两个大型语言模型。它不仅可以与用户进行对话,还可以根据用…