算法打卡day40

今日任务:

1)139.单词拆分

2)多重背包理论基础(卡码网56携带矿石资源)

3)背包问题总结

4)复习day15

139单词拆分

题目链接:139. 单词拆分 - 力扣(LeetCode)

给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:
拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:
输入: s = "leetcode", wordDict = ["leet", "code"]
输出: true
解释: 返回 true 因为 "leetcode" 可以被拆分成 "leet code"。示例 2:
输入: s = "applepenapple", wordDict = ["apple", "pen"]
输出: true
解释: 返回 true 因为 "applepenapple" 可以被拆分成 "apple pen apple"。
注意你可以重复使用字典中的单词。示例 3:
输入: s = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]
输出: false

文章讲解:代码随想录 (programmercarl.com)

视频讲解:动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分哔哩哔哩bilibili

思路:

字典里的单词是可以被重复的,这是一个完全背包问题。字符串中的单词是有序的,所以相当于是做排列问题,应该先遍历背包,再遍历物品

这里的s字符串就是背包:创建数组dp[j],不断更新dp[j]的值为True或False。也就是如果s[:j]能拆分,则dp[j] 为True

这里的单词就是物品:我们的目标是检查是否可以将字符串拆分为字典中的单词,这里有两种处理方法,一种是遍历字典中的单词,判断其在背包中能否拆分出来,有一个单词能被拆分都行;另一种是在s[:j]的每一个位置切分,判断s[i:j]是否存在字典中

class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:dp = [False] * len(s)dp.insert(0, True)# print(dp)for j in range(1, len(s) + 1):for word in wordDict:lenth = len(word)if j >= lenth:dp[j] = dp[j] or (dp[j-lenth] and word == s[j-lenth : j])# print(f'当物品为{word}时,dp[{j}]={dp[j]}')# print(f'此时j={j},dp={dp}')return dp[-1]def wordBreak2(self, s: str, wordDict: List[str]) -> bool:# 初始化动态规划数组,dp[j]表示s的前j个字符是否可以被拆分成字典中的单词dp = [False] * (len(s)+1)dp[0] = True# 将字典中的单词转换为集合,便于快速判断单词是否在字典中word_set = set(wordDict)# 遍历背包for j in range(1,len(s)+1):# print(f'j={j}')# 在背包大小的字符串s[:j]中寻找分割点(s[left:right]左闭右开),看是否存在以s[j]结尾的单词for i in range(j+1):# print(s[i:j])# 如果前i个字符可以被拆分且s[i:j]在字典中,则将dp[j]设置为Trueif s[i:j] in word_set and dp[i]:dp[j] = Truebreak# 返回整个字符串s是否可以被拆分return dp[-1]

感想:

这题要注意i,j分别在dp和s中表示什么。很容易弄错,自己画图比较清晰
这里有一个优化,我们将字典中的单词转换为集合,便于快速判断单词是否在字典中

假设我们有一个单词列表 wordDict,其中包含了若干个单词。如果我们将这个列表转换为集合 wordSet,则每个单词就会成为 wordSet 中的一个元素。这样,当我们需要判断某个单词是否在字典中时,只需要使用集合的 in 操作符即可。这个操作会以常量时间(O(1))内完成,因为集合底层使用哈希表实现,可以快速地定位元素。

相比之下,如果我们使用列表来表示字典,那么在判断单词是否在字典中时,需要遍历整个列表,时间复杂度会是 O(n),其中 n 是字典中单词的数量。这样的时间复杂度在实际应用中可能会较高,尤其是当字典中包含大量单词时。

因此,将字典中的单词转换为集合后,能够以更高效的方式进行单词的查找,从而加快了判断字符串是否可以被拆分的速度。

多重背包理论基础(卡码网56携带矿石资源)

题目链接:56. 携带矿石资源(第八期模拟笔试) (kamacoder.com)

题目描述
你是一名宇航员,即将前往一个遥远的行星。在这个行星上,有许多不同类型的矿石资源,每种矿石都有不同的重要性和价值。你需要选择哪些矿石带回地球,但你的宇航舱有一定的容量限制。
给定一个宇航舱,最大容量为 C。现在有 N 种不同类型的矿石,每种矿石有一个重量 w[i],一个价值 v[i],以及最多 k[i] 个可用。不同类型的矿石在地球上的市场价值不同。你需要计算如何在不超过宇航舱容量的情况下,最大化你所能获取的总价值。输入描述
输入共包括四行,第一行包含两个整数 C 和 N,分别表示宇航舱的容量和矿石的种类数量。
接下来的三行,每行包含 N 个正整数。具体如下:
第二行包含 N 个整数,表示 N 种矿石的重量。
第三行包含 N 个整数,表示 N 种矿石的价格。
第四行包含 N 个整数,表示 N 种矿石的可用数量上限。输出描述
输出一个整数,代表获取的最大价值。输入示例
10 3
1 3 4
15 20 30
2 3 2输出示例
90提示信息
数据范围:
1 <= C <= 10000;
1 <= N <= 10000;
1 <= w[i], v[i], k[i] <= 10000;

文章讲解:代码随想录 (programmercarl.com)

思路:

这个问题可以使用动态规划来解决。我们可以定义一个二维数组 dp[i][j],其中 dp[i][j] 表示前 i 种矿石,容量为 j 的情况下所能获取的最大价值。

具体的动态规划转移方程为:

dp[i][j] = \max(dp[i-1][j], dp[i-1][j - w[i]] + v[i],dp[i-1][j-2*w[i]]+2*v[i],...,dp[i-1][j-k[i]*w[i]]+k[i]*v[i])

其中,dp[i−1][j−w[i]]+v[i] 表示选择了第 i 种矿石,并且当前容量为 j,剩余容量为 j-w[i] 时的最大价值,加上选取当前矿石所获得的价值 v[i]。

根据这个方程,我们可以进行动态规划计算,最终得到dp[N][C],即前 N 种矿石,容量为 C 时所能获取的最大价值。

def max_value():# 从键盘上采集输入数据C, N = map(int, input().split())  # 宇航舱的容量和矿石的种类数量weights = list(map(int, input().split()))  # 矿石的重量values = list(map(int, input().split()))  # 矿石的价格limits = list(map(int, input().split()))  # 矿石的可用数量上限# 创建二维动态规划数组,初始化为0dp = [[0] * (C + 1) for _ in range(N + 1)]# 遍历每种矿石for i in range(1, N + 1):# 遍历容量for j in range(1, C + 1):# 当前容量 j 不足以装下当前矿石 i 时,不选择该矿石dp[i][j] = dp[i - 1][j]# 遍历当前矿石可用数量上限for k in range(1, min(j // weights[i - 1], limits[i - 1]) + 1):# 计算选择 k 个当前矿石 i 后的总价值dp[i][j] = max(dp[i][j], dp[i - 1][j - k * weights[i - 1]] + k * values[i - 1])# 返回前 N 种矿石,容量为 C 时的最大价值return dp[N][C]# 调用函数并输出结果
print(max_value())

这个函数的时间复杂度为 O(N * C * k_max),其中 N 是矿石种类数量,C 是宇航舱的容量,k_max 是矿石的可用数量上限中的最大值。

采用一维dp数组解决,代码如下:

动态转移方程:dp[j] = \max(dp[j], dp[j - k \times weights[i - 1]] + k \times values[i - 1])

其中:

  • dp[j] 表示容量为 j 时的最大价值;
  • weights[i−1] 表示第 i 种矿石的重量;
  • values[i−1] 表示第 i 种矿石的价格;
  • k 表示选择的第 i 种矿石的数量,1\leq k\leq min(\frac{j}{weight[i-1]},limit[i-1])
def max_value2():# 从键盘上采集输入数据C, N = map(int, input().split())  # 宇航舱的容量和矿石的种类数量weights = list(map(int, input().split()))  # 矿石的重量values = list(map(int, input().split()))  # 矿石的价格limits = list(map(int, input().split()))  # 矿石的可用数量上限# 创建一维动态规划数组,初始化为0dp = [0] * (C + 1)# 遍历每种矿石for i in range(1, N + 1):# 逆序遍历容量,确保每个矿石只使用一次for j in range(C, 0, -1):# 遍历当前矿石可用数量上限for k in range(1, min(j // weights[i - 1], limits[i - 1]) + 1):# 计算选择 k 个当前矿石 i 后的总价值dp[j] = max(dp[j], dp[j - k * weights[i - 1]] + k * values[i - 1])# 返回容量为 C 时的最大价值return dp[C]# 调用函数并输出结果
print(max_value2())

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

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

相关文章

【Hive】自定义函数从编写到应用的整个流程(以UDF为例)

1. 编写UDF程序 以Java为例&#xff0c;编写一个字符串反转的函数&#xff08;工程依赖部分略&#xff09;&#xff1a; package com.example;import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.hive.ql.exec.Description; import org.apache.hadoop.hiv…

Pytorch学习笔记——TensorBoard的初使用

1、TensorBoard介绍 TensorBoard是TensorFlow的可视化工具&#xff0c;但它也可以与PyTorch结合使用。TensorBoard提供了一个Web界面&#xff0c;可以展示你训练过程中的各种信息&#xff0c;如损失值、准确度、权重分布等&#xff0c;更好地帮助开发者理解和调试模型。 Tenso…

huggingface里如何查看具体任务的评估指标

如果我们在做一个模型训练任务的时候&#xff0c;可能会不知道这个任务在评估的时候使用什么指标&#xff0c;那么huggingface里边为我们提供了参考&#xff1a; 下面就来看看吧&#xff1a; https://huggingface.co/https://huggingface.co/ 点击"Docs"&#xff…

【算法】【单调栈】【leetcode】1019. 链表中的下一个更大节点

刷这题之前先看&#xff1a; 【算法】【OD算法】【单调栈】找朋友-CSDN博客 【算法】【单调栈】【leetcode】1475. 商品折扣后的最终价格-CSDN博客 【算法】【单调栈】【leetcode】901. 股票价格跨度-CSDN博客 【算法】【单调栈】每日温度-CSDN博客 题目地址&#xff1…

嵌入式硬件中PCB走线与过孔的电流承载能力分析

简介 使用FR4敷铜板PCBA上各个器件之间的电气连接是通过其各层敷着的铜箔走线和过孔来实现的。 由于不同产品、不同模块电流大小不同,为实现各个功能,设计人员需要知道所设计的走线和过孔能否承载相应的电流,以实现产品的功能,防止过流时产品烧毁。 文中介绍设计和测试FR4敷…

iOS分享弹窗

klkxxy/分享菜单弹窗

抖音视频0粉营销推广墙纸,当日收益,第二天提现,日入300

项目简介&#xff1a; 这个项目非常易于执行&#xff0c;主要涉及在抖音平台上分享爱国主题的壁纸&#xff0c;并通过推广相关的小程序来实现盈利。 下 载 地 址 &#xff1a; laoa1.cn/1849.html 项目操作简便&#xff0c;一般只需花费1个小时即可完成&#xff0c;一旦掌…

【每日刷题】Day31

1. 2074. 反转偶数长度组的节点 - 力扣&#xff08;LeetCode&#xff09; //思路&#xff1a;双指针遍历。将链表存入数组中&#xff0c;通过双指针下标遍历定位需要反转的组。 typedef struct ListNode LN; void Reverse(int* arr,int left,int right)//反转函数 { while(left…

408数据结构-二叉树的概念、性质与存储结构 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 二叉树的定义 二叉树是一种特殊的树形结构&#xff0c;其特点是每个结点至多只有两棵子树&#xff08;即二叉树中不存在度大于 2 2 2的结点&#xff09;&#xff0c;并且二叉树是有序树&#xff0c;左右子树不能互换。 与树类似&#…

探索和构建 LLaMA 3 架构:深入探讨组件、编码和推理技术(三)KV缓存

探索和构建 LLaMA 3 架构&#xff1a;深入探讨组件、编码和推理技术&#xff08;三&#xff09; KV缓存 在推理的每一步中&#xff0c;只对模型输出的最后一个标记感兴趣&#xff0c;因为已经有了之前的标记。然而&#xff0c;模型需要访问所有先前的标记来决定输出哪个标记&…

07 - 步骤 javaScript代码

简介 JavaScript 代码是通过 JavaScript 脚本步骤来执行 JavaScript 脚本的一种方式。这允许用户在 Kettle 的数据流程中使用 JavaScript 编写自定义的脚本逻辑&#xff0c;用于数据处理、转换、计算等操作。 使用 场景 我需要在数据流加一个字段 createTime 当前时间&…

java学习笔记12

21. System类和Runtime类 21.1 System类 System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的,直接使用System类调用即可。System类的常用方法如下标所示: 方法名称功能描述static void exit(int status)终止jvm, status!=0表示异常终止jvmstatic vo…

《有限元分析及应用》《有限元分析基础教程》-曾攀-清华大学|pdf电子书+有限元分析及应用视频教程(全85讲) 曾攀、雷丽萍 ​​​+课件PPT

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

关于开源软件的影响力的探讨

开源软件的影响力 开源软件在软件开发领域中扮演着至关重要的角色&#xff0c;其影响力主要体现在以下几个方面&#xff1a; 开放源代码促进了全球开发者之间的协作和交流&#xff1a; 开源软件的源代码是公开可见的&#xff0c;这意味着任何人都可以查看、修改和分享代码。这…

找不到msvcr110.dll的多种解决方法,轻松解决dll问题

在日常使用计算机的时候&#xff0c;突然提示&#xff1a;“由于找不到msvcr110.dll&#xff0c;无法继续执行代码”。这个错误通常发生在运行某些程序时&#xff0c;系统无法找到所需的动态链接库文件。这个问题可能会给用户带来困扰&#xff0c;但是不用担心&#xff0c;下面…

Linux下运行jar包的方式

方式一&#xff1a;java -jar xx.jar 这样运行 java 程序遇到的问题就是&#xff0c;你不能在这个窗口进行其他操作&#xff0c;使用 CtrlC 就可以终止程序的执行&#xff0c;关闭 shell 窗口也会终止程序的执行。 方式二&#xff1a; java -jar XXX.jar & 关闭 xshell …

Codeforces Round 943 (Div. 3)

A O ( x ) O(x) O(x) 枚举即可&#xff0c;我也是这么做的&#xff0c;但是可以利用以下的性质来 O ( 1 ) O(1) O(1) 解决问题。 首先&#xff0c;gcd(a, b) gcd(a-b,b), 其中 a ≥ b a\geq b a≥b 其次&#xff0c;gcd(x,x-1)1, 其中 x ≥ 1 x\geq 1 x≥1 利用这两个性…

Golang 设计模式(行为型)

文章目录 策略模式迭代器模式访问者模式观察者模式命令模式模板方法模式责任链模式状态模式 策略模式 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装成独立的对象&#xff0c;使得它们可以互相替换。在 Go 语言中&#xff0c;策略…

QT:输入类控件的使用

LineEdit 录入个人信息 #include "widget.h" #include "ui_widget.h" #include <QDebug> #include <QString>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);// 初始化输入框ui->lineEdit…

Debian 德比安 Nginx + PHP + MySql + beanstalkd + Redis + Node.js

网卡模式选择桥接 mirrors.163.com 阿里镜像源 https://mirrors.aliyun.com/debian/ DeBian 安装软件选择时勾选上 SSH server apt update apt install sudo #安装 sudo usermod -aG sudo username #添加普通账号到 sudo 让 root 可以 SSH 配置文件 /etc/ssh/sshd_config 找…