代码随想录 Day 43 | 【第九章 动态规划part 06】322. 零钱兑换、279.完全平方数、139.单词拆分、

5个4000比特大状态置换算法的设计与分析 下面是 5 个概念性、实验性的 4000 位可逆置换设计。它们都保证是双射,但未经过密码分析,不可直接用于生产系统。风格分别覆盖:三维 SPN、Feistel、可逆元胞自动机、ARX、宽轨迹/Keccak 式结构。 这 5 个设计分别代表了 SPN、Feistel、元胞自动机、ARX、宽轨迹 Keccak 五种不同风格,覆盖了主流大状态置换的构造思路。再次强调:它们只是实验性概念,若要用于实际协议,必须经过严格安全性分析。 阅读详情

一、322. 零钱兑换

322. 零钱兑换

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

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

这句话结合本题 大家要好好理解。

视频讲解:动态规划之完全背包,装满背包最少的物品件数是多少?| LeetCode:322.零钱兑换_哔哩哔哩_bilibili

代码随想录

1. 解题思路

(1)DP数组的含义:装满容量为 j 的背包,最少物品为DP[j],最终要求DP[amount]。

(2)递推公式:dp[j] = min(dp[j], dp[ j-coins[i] ] + 1)

(3)初始化:DP[0] = 0,非0下标初始为非0最大值,这样在递推过程中不会被0覆盖。

(4)遍历顺序:本题求装满背包的最小元素数量,所以本题的遍历顺序无论是先遍历顺序还是背包都没有影响,也就是求排列数或者组合数都没有影响。

(5)打印DP数组。

2. 代码实现

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [float('inf')] * (amount+1)
        dp[0] = 0
        for i in coins:
            for j in range(i, amount+1):
                dp[j] = min(dp[j], dp[j-i]+1)
        if dp[amount] == float('inf'):
            return -1
        return dp[amount]

 

二、279.完全平方数

279.完全平方数

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做

视频讲解:动态规划之完全背包,换汤不换药!| LeetCode:279.完全平方数_哔哩哔哩_bilibili

代码随想录

1. 解题思路

如果拼凑不成应该返回什么?本题无需考虑这种情况,因为有1的存在,所以任何一个正整数都可以由完全平方数去进行拼凑得到。

2. 代码实现

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float('inf')] * (n + 1)
        dp[0] = 0
        for i in range(1, n+1):
            j = 1
            while j * j <= i:
                dp[i] = min(dp[i], dp[i - j*j]+1)
                j += 1
        return dp[n]

 

三、139.单词拆分 

139.单词拆分

1. 解题思路

(1)定义dp数组的含义:字符串长度为 i,能被下面单词组成的话,dp[i]就为True,bool类型。

(2)递推公式:dp[i]是True or False依赖于哪些状态:如果区间j到i出现在单词里,同时dp[j]为True,则dp[i]就为True。

(3)dp数组初始化:dp[0] = True保证后面递推不全是False,非0下标初始化为False。

(4)遍历顺序 :因为字符串里面的单词组合是有序的,所以本题对物品的顺序是有要求的,不能随意置换遍历顺序。本题先遍历背包再遍历物品,先截取物品,再判断截取的这个物品是否出现在字典里,如果在字典里并且dp[i] == True,那么dp[j] == True。

(5)打印dp数组。

2. 代码实现

  1. 初始化动态规划数组 dp:
    • dp = [False] * (len(s)+1):创建一个长度为 len(s)+1 的布尔数组 dp,所有元素初始化为 False。这里数组的长度是 len(s)+1 是因为我们需要考虑从字符串的起始位置(索引0)到结束位置(索引 len(s)-1)的所有子串,以及一个额外的空子串(索引0表示的情况)。
    • dp[0] = True:设置 dp[0] 为 True 表示空字符串可以被成功拆分(因为没有字符需要拆分)。
  2. 动态规划过程:
    • 外层循环 for i in range(1, len(s)+1):遍历字符串 s 的所有可能结束位置(从索引1到 len(s))。
    • 内层循环 for word in wordDict:遍历字典 wordDict 中的所有单词。
    • 判断条件 if i >= len(word):确保当前考虑的子串 s[i-len(word):i] 的长度至少与单词 word 一样长。
    • 状态转移方程 dp[i] = dp[i] or (dp[i-len(word)] and word == s[i-len(word):i]):如果 dp[i-len(word)] 为 True(表示子串 s[0:i-len(word)] 可以被成功拆分),并且当前考虑的单词 word 等于 s 从 i-len(word) 到 i 的子串,则将 dp[i] 设置为 True。这表示从字符串开始到当前位置 i 的子串可以被成功拆分。
  3. 返回结果:
    • return dp[len(s)]:返回 dp 数组的最后一个元素,即 dp[len(s)]。这个值表示整个字符串 s 是否可以被成功拆分成字典 wordDict 中的单词。
class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dp = [False] * (len(s)+1)
        dp[0] = True
        for i in range(1, len(s)+1):
            for word in wordDict:
                if i >= len(word):
                    dp[i] = dp[i] or (dp[i-len(word)] and word == s[i-len(word):i])
        return dp[len(s)]

四、总结篇

关于多重背包,你该了解这些!

代码随想录

背包问题总结篇!

代码随想录

【Qt】QML-01:使用QtCreator10创建QML工程,并讲解第一个程序:Hello World QML第一讲:创建QML工程、详解QML第一个程序Hello World 阅读详情

相关推荐

Unity Android平台下插件/SDK开发通用流程

本文主要面向对Android开发不甚了解的Unity开发者,介绍了基于最新的Android Studio的标准Android开发环境与项目结构的配置流程,在此基础上,开发者可以快速的进行SDK的接入与插件的开发。

ZhangDi2017的博客 1万+

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 218

晟矽微MC32F7361定时器的使用案例说明

110所以TIMER0所用的频率是FCPU的1/64,也就是8/64MHZ. 为1/8MHZ。//io口下拉电阻 1:enable 0:disablea。//io口上拉电阻 1:enable 0:disable。//io口下拉电阻 1:enable 0:disable。//io口上拉电阻 1:enable 0:disable。//io口下拉电阻 1:enable 0:disable。//io口上拉电阻 1:enable 0:disable。

liyanfei123456的博客 1130

【算法拾光】链表 哈希表|K个一组翻转链表 + 两数之和

K个一组翻转链表需分段反转,借助哑节点与前驱指针维护连接,避免断链;两数之和利用哈希表实现O(1)查找,空间换时间,高效定位目标组合。前者考察链表指针操作,后者聚焦映射关系构建,均为面试高频题。

wuqingyigexiaoba的博客 314

WPF基础系列六:MVVM框架

MVVM框架 文章目录MVVM框架前言一、MVVM框架简介1. 什么是MVVM?2. MVVM的优势3.MVVM的应用场景二、MVVM使用及示例 前言 在WPF开发中,经典的编程模式是MVVM,是为WPF量身定做的模式,该模式充分利用了WPF的数据绑定机制,最大限度地降低了Xmal文件和CS文件的耦合度,也就是UI显示和逻辑代码的耦合度,如需要更换界面时,逻辑代码修改很少,甚至不用修改。 与WinForm开发相比,我们一般在后置代码中会使用控件的名字来操作控件的属性来更新UI,而在WPF中通常是通过

iceberg7012的博客 2万+

[Ethernet in CANoe]2--如何在CANoe中去仿真CP版本的SOME/IP通信

上篇文章()介绍了SOME/IP的两种类型的数据格式,根据作者目前的项目经验,目前在CANoe V18之前的版本,CP版本的arxml是最方便实现SOME/IP以太网仿真的。作者目前只有CANoe V17的license,所以本片文章是在CANoe 17上基于CP版本的arxml去做仿真模拟。

汽车ECU自动化测试 1764

排序算法深度笔记(下):非比较类排序的线性突破与工程边界

排序算法时间复杂度额外空间复杂度稳定性是否基于比较选择排序O(N^2)(O(1))不稳定是冒泡排序O(N^2)(O(1))稳定是插入排序O(N^2)(O(1))稳定是归并排序O(N\log N)(O(N))稳定是快速排序O(N\log N)O(log N)不稳定是堆排序O(N\log N)O(1)不稳定是计数排序(O(N + M))O(M))稳定否基数排序O(N)稳定否桶排序平均O(N) / 最坏O(N^2)

2401_87069538的博客 590

GD32F103VBT6串口OTA升级保姆级教程:当硬件没留Boot0引脚时,我是如何用Keil和Ymodem搞定的

本文详细介绍了GD32F103VBT6在无Boot0引脚情况下的串口OTA升级方案,通过Keil工程改造和Ymodem协议实现可靠固件更新。文章涵盖Bootloader配置、APP工程调整、Ymodem传输优化等关键步骤,为嵌入式开发者提供了一套完整的解决方案,特别适用于封闭式设备的远程更新需求。

weixin_28744613的博客 183

算法日常・每日刷题--<动态规划>42

本题为“不相交的线”,与最长公共子序列问题相似。使用动态规划求解:定义 dp[i][j] 表示 nums1[0:i] 与 nums2[0:j] 的最大不相交连线数。若元素相等,则继承左上值加1;否则取上方或左方最大值。最终返回 dp[m][n],即两数组的最大不相交连线数。时间复杂度 O(mn),空间复杂度 O(mn)。

2503_92261635的博客 20

芯片原厂linux驱动开发的分享

大家好,我是XX,来自湖南XX学院,电子信息18级,也曾在创新基地控制组学习过两三年,毕业后就职于一家芯片原厂的解决方案部,担任驱动工程师的职位,算上实习期,我的工作时长已有两年。在此我想将这两年期间学习与积累到的一些经验输出出来,与大家一同分享。知识面有限,只能简单介绍一些驱动开发方向的一些经验,且由于经验尚浅,文中难免会有一些疏漏和错误之处,还请大家积极地批评指正。

嵌入式技术开发 849

用 Joule 点燃 ABAP 开发者的舞台感:SAP BTP 上的 ABAP AI 能力实战解读

摘要:SAP推出的Joule for developers和ABAP AI功能为开发者提供了智能辅助工具,旨在优化ABAP开发流程。主要功能包括上下文感知的代码预测补全、代码解释、单元测试生成和开发问题实时解答。这些能力特别适合应对Cloud环境下ABAP开发的复杂约束,如Clean Core原则和受限语法范围。通过减少重复劳动和提升代码理解效率,该工具帮助开发者将注意力集中在业务逻辑而非技术细节上。随着企业加速向S/4HANA迁移,这些AI功能将在遗留代码改造和云适配中发挥更大作用,建议团队将其纳入工程体

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 297

C语言程序设计题|有序数组插入数字冒泡排序

题目要求将一个数插入有序数组末尾,并用冒泡排序实现整体升序。代码先将输入数存入数组最后位置,再通过双重循环进行冒泡排序,每轮将较大元素向后移动,最终输出11个升序元素。该方法虽时间复杂度为O(n²),但符合题目要求,逻辑清晰,适合初学者理解排序原理。

2301_81429079的博客 750

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【算法拾光】模拟|外观数列 + 数青蛙

本文总结两道模拟题解法:外观数列通过迭代统计连续数字个数生成下一项,关键在于处理末尾字符;数青蛙则模拟青蛙叫声“croak”状态转移,维护各阶段青蛙数量,记录最大并发数并确保全部完成。共性在于严格遵循流程、细致处理边界与非法情况,锻炼字符串遍历与状态管理能力。

wuqingyigexiaoba的博客 370

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

牛客周赛165C题(前后缀性质,递推,排序,枚举)

题目大意:给定长度为 `n` 的数组,选择 `k ∈ [1,n]`,将前 `k` 个元素整体翻转,后面的元素不变。要求操作后的整个数组非递减,统计满足条件的 `k` 的数量。题目链接:https://ac.nowcoder.com/acm/contest/141721/C。时间复杂度:O(nlogn)

2501_94316951的博客 171

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

408 算法 04|主元素与三元组最小距离:两种“扫描时做决定“的思路

2013(41) 的主元素用摩尔投票一遍选出候选,但真正的考点是"选完必须验票";2020(41) 的三元组最小距离,三指针每次只挪最小的那个,靠的是 D=2×(max−min) 这个恒等式。两套完整 C 代码加真实输出,附官方评分档位表。

m0_56226131的博客 409

【数据结构-3】算法美学之降复杂度

在while循环的循环体内,首先用临时变量保存最后一个位置的数据,再通过for循环把所有元素往后移动一位,最后把tmp中保存的值放到下标为0的位置上去。方法二的思路是:创建新数组,让原数组中后k个数据移动到新数组中前面的位置,让原数组中前numsSize-k个数据移动到新数组中后面的位置,这。这段代码的思路是:三次逆置,第一次逆置前numsSize-k个数据,第二次逆置后k个数据,最后整体逆置。这篇博文分享一道解法不一的算法题,求解过程的目的在于降低算法的时间复杂度,题源力扣。,属于空间换时间的操作。

weixin_44218929的博客 85

算法61,判定是否为字符重排

两字符串能互为重排 ⇔。

sheshibenniaodan的博客 218

算法日常・每日刷题--<动态规划>32

给定严格递增的正整数数组,求最长斐波那契子序列长度。使用二维DP,dp[i][j]表示以arr[i]、arr[j]为最后两项的序列长度,初始化均为2。通过哈希表快速查找前一项target = arr[j] - arr[i],若存在且下标小于i,则状态转移:dp[i][j] = dp[k][i] + 1。遍历更新全局最大长度,最终若结果小于3则返回0。时间复杂度O(n²),空间复杂度O(n²)。

2503_92261635的博客 178

算法札记:几何分布在算法题UVA1262的运用

集卡问题求解核心:将集齐n种优惠券的过程分为n个阶段,每个阶段期望购买次数为 $ \frac{n}{k} $(k为剩余种类数),总期望为 $ n \cdot H_n $(调和数)。通过自洽方程推导单阶段期望,无需几何分布或无穷级数,逻辑清晰且适用于大一水平。例如,n=5时期望约11.42,非5。题目要求以带分数形式输出精确结果,算法上需累加分数并化简。

Keven_11的博客 353

SSL证书选RSA还是ECDSA:公钥算法、CA签名与兼容性怎么核对

申请SSL证书时,RSA和ECDSA该怎么选?先分清站点公钥算法、CA签名算法和TLS实际兼容性,再用隔离OpenSSL实验读取两类材料,核对申请、续期和部署交接,避免只看Signature Algorithm就选错。

谁呀!的博客 399

考拉兹猜想 - 7

本文通过引入虚数单位重构Collatz猜想的迭代逻辑,指出偶数减半与奇数“乘3加1”的过程在虚数坐标下等价于归结操作。关键在于:乘3加1使奇数跃升至偶数,随后持续减半,而虚数单位代表“无限减1”,实现无限向有限的转化。无论初始值如何,减半始终主导,最终归结为4-2-1循环。该视角消解了正向思维中的速度竞争疑虑,证明归结是必然结果。

杨铸人的博客 42

从曲线到储层:Techlog/KAPPA 全流程算法、UltraLAB 选型与本地 AI 部署实战

以高频 CPU 保证交互,以充足内存承载多井与多任务,以 NVMe 打通项目和知识库 I/O,再按本地模型、上下文与并发配置 GPU。对 UltraLAB 用户而言,更合理的采购方式是带着真实项目做选型:一组典型井、一套完整解释模板、一个目标大模型、一次多人并发测试。用实测结果确定配置,才能把预算转化为解释效率,而不是闲置算力。软件模块、操作系统与许可条件以厂商当前正式说明为准;硬件建议需结合项目实测。AI 输出只能作为辅助证据,不能替代岩石物理与油藏工程专业审核。

wdf8088的博客 181

贪心题目:可以到达的最远建筑

为了到达尽可能远的建筑物,在将砖块替换成梯子时,应将高度差最大位置的砖块替换成梯子,此时剩余的砖块数量最多,如果将高度差较小位置的砖块替换成梯子,则剩余的砖块数量较少,能到达的最远建筑物下标不可能更大。开始向后面的建筑物移动,移动过程中维护优先队列存储正高度差,优先队列的队首元素是最大元素,每次遇到正高度差时优先考虑使用砖块,如果砖块数量不够则使用梯子替换最大高度差位置的砖块,直到砖块和梯子都使用完毕时,到达的建筑物即为最远建筑物。如果以最佳方式使用给定的梯子和砖块,返回可以到达的最远建筑物的下标。

stormsunshine的博客 290

强化学习第十一课:完整 Q-Learning 算法

表示有:\[ 5 \]0 1 2 3 40:向左1:向右目标位置:\[ 4 \]

qq_56657939的博客 303

【Deep-OC-SORT 01】多轨迹算法Deep-OC-SORT源码分析

本工程基于Deep-OC-SORT核心模块,重构并适配了EmbeddingComputer(外观特征提取)、CMCComputer(相机运动补偿)与OCSort(主跟踪器)三类。前者实现整框/网格模式的特征提取与L2归一化;后者通过稀疏光流或SIFT匹配估计仿射变换,补偿相机运动;主跟踪器融合IoU、外观相似度与方向一致性,支持模块开关与自定义组件,实现高效多目标跟踪。

Jayson 博客 336

【Deep-OC-SORT 05】多轨迹算法Deep-OC-SORT-IoU代价与VDC方向一致性融合过程

本工程在DeepOcSort中实现三路融合关联:IoU(位置重叠)、VDC(速度方向一致性)与外观相似度,通过加权求和生成总相似度,取负作为匈牙利算法的代价。其中,VDC利用轨迹惯性方向与检测方向的点积判断运动一致性,抑制反向误匹配;外观分采用网格化余弦距离并结合动态权重AW,提升遮挡场景下的鲁棒性。支持关闭外观分支(--emb_off),且通过快路径优化加速多数帧处理。最终配对经IoU复核,确保位置合理性,有效减少密集场景下的ID切换。

Jayson 博客 336
上一篇: 代码随想录 Day 42 | 【第九章 动态规划 part 05】完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶)
下一篇: 代码随想录 Day 44 | 【第九章 动态规划part 07】198.打家劫舍、213.打家劫舍II、337.打家劫舍III
Accept17
博客等级 码龄4年 479粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值