自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(139)
  • 收藏
  • 关注

原创 python踩坑:python引用和c++的区别

另一种方式是使用可变对象,如列表,将值存储在列表中,并将列表传递给函数。因为列表是可变的,所以可以在函数内部修改列表的元素,会影响到原始列表。int类型这种不可变对象,在python中类似值传递,所以函数里面修改了值,函数外面还是不变的,就会和想象的不一样。记录一个python的坑,调试的时候发现打印出来的变量和自己想象中的值不太一样,发现是Python引用的问题。,赋值和传参将导致新创建对象,这和C++的引用行为是不同的。,赋值和传参,和C++引用的行为一致,是真正的。在 Python 中,

2023-12-11 15:24:12 162

原创 专题:链表常考题目汇总

指针存放地址ListNode*是一个指针,它存储的是链表节点的地址。删除节点在删除链表中的一个节点前,需要有一个临时指针变量存储该节点的地址。这是因为在更改前一个节点的next指针,跳过当前节点后,如果没有这个临时指针,你将无法访问到这个节点,也就无法释放它占用的内存。释放内存一旦链表中的节点被跳过,且没有其他指针指向它,你就需要通过临时指针来释放该节点的内存,防止内存泄漏。保持链表连贯性: 使用临时指针,在逻辑上移除链表节点之前保存节点地址可以在物理上移除该节点时保持链表的连贯性。

2023-10-20 23:01:50 811

原创 算法专题:前缀和

首先思路就是运用前缀和,单独开一个x数组遍历所有的nums[i],满足条件计数为1,不满足条件计数为0。求子数组中某一段数字的元素和,只需要转换成两个数字的差值就可以了。这种写法因为子数组两边都不定,会超时,时间复杂度是O(n^2)。遍历完了数组之后一定会收集所有的相加=目标和的两数组合。两数之和的优化方法是,遍历到nums[i]的时候,先看看。)子区间和 (即 3 + 4 + 5),我们可以使用。**注意:**子数组是数组中的一个连续非空的元素序列。以整数形式表示并返回趣味子数组的数目。

2023-09-07 22:39:40 547

原创 D361周赛复盘:模拟分割整数⭐+变为整除的最小次数⭐

总结来说就是要知道x能被num整除的等价条件,然后用布尔值记录倒着遍历过的数字,最后如果都没有但是有一个0,也需要考虑。我们可以直接倒序遍历,并且用布尔值记录之前的遍历中有没有碰到可以和当前数字(0/2/5/7)组成一对儿的数。如果整个遍历完成了,都不存在成对的00/25/50/75,但是有一个0的话,答案就是n-1。本题求的是删成特殊数字的最小次数,重点是x被25整除的等价条件。div这个数字就是用来分割的,要分割成两部分,所以。位数字之和相等,则认为这个数字是一个对称整数。,用%的操作累加每一位数字。

2023-09-07 21:34:06 403

原创 D360周赛复盘:模拟(思维题目)⭐⭐+贪心解决可能的最小和(类似上次)

这个解法的核心思想是,为了达到最远的距离,应该尽可能地选择一个方向移动。次之后,请你找出可以到达的距离原点。本题就和上次周赛的贪心很像了,求得也是。返回符合条件的美丽数组所可能具备的。字符串表示你在一条原点为。和上次周赛代码基本相同,求的都是。,所以需要从最小的数字开始取!满足下述条件,则称其为。的数轴上的若干次移动。你的初始位置就在原点(

2023-09-01 22:22:35 297

原创 D359周赛复盘:贪心解决求最小和问题⭐⭐+较为复杂的双层线性DP⭐⭐

如果用 dp[i] 而不是 dp[i + 1]来表示的话,那 dp[0]的意思就是不超过编号为0的。的含义是:dp[i+1]表示销售编号不超过i的房屋的最大盈利。正整数组成的数组,如果其中不存在任何求和等于 k 的不同元素对,则称其为。因为求解的是可能的最小和,所以都是贪心来做。,但是下标不能是-1,所以就要把 dp 数组的下标移一下 , 让它别越界。,即根本不存在以房屋i为结尾的方案,但是dp[i+1]最少也要=dp[i]同一所房屋不能卖给不同的买家,并且允许保留一些房屋不进行出售。

2023-09-01 22:21:34 755

原创 D358周赛复盘:哈希表模拟⭐⭐+链表乘法翻倍运算(先反转)⭐⭐⭐

这种方法的好处是我们只需要遍历两次链表,一次是反转,一次是翻倍处理,所以总体的时间复杂度是 O(n),其中 n 是链表的长度。在完成上述的翻倍处理后,链表仍然是反转的状态,所以我们需要再次反转它以得到正确的答案。但是java中没有既可以自动排序,又可以用下标取的数据类型。本题用java解法通过,但是cpp同样的写法,不知道为啥超时了。返回最大和,如果不存在满足题意的数字对,返回。的一对数,且这两个数数位上最大的数字相等。,请你反转链表,并返回反转后的链表。的两个元素之间的差值绝对值的。

2023-09-01 22:20:31 252

原创 D357周赛复盘:模拟双端队列反转⭐⭐+贪心

如果最后的插入方向是在头部(即。

2023-09-01 22:17:38 224

原创 DAY56:单调栈(二)下一个最大元素Ⅱ(环形数组处理思路)

给定一个循环数组 ( 的下一个元素是 ),返回 中每个元素的 下一个更大元素 。数字 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 。示例 1:示例 2:提示:本题属于循环数组问题,循环数组的处理,我们可以将两个nums数组拼接在一起,使用单调栈计算出每一个元素的下一个最大值,最后再把结果集即result数组resize到原数组大小即可。但这种写法,修改了nums数组,而且最后还要把result数组r

2023-08-02 20:53:21 264

原创 DAY55:单调栈(一)每日温度+下一个更大元素Ⅰ

本题只要想明白映射关系,因为nums1元素需要和nums2元素进行对应,对应的结果是nums2元素的下一个最大元素。因此我们可以先把nums2元素的元素值-下一个最大元素进行键值对的对应,再遍历nums1,查找Key值相同的时候,对应的结果值。

2023-08-02 20:51:38 191

原创 Line 171: Char 16: runtime error: reference binding to misaligned address 0xbebebebebebec0ba for typ

leetcode 503.下一个更大元素Ⅱ报错代码:错误信息的意思是:运行时发生了一种未定义行为(Undefined Behavior)。具体来说,它在尝试对一个非对齐的地址(即不是4字节对齐的地址)进行整数的引用绑定,而这个操作是未定义的。该错误通常发生在空指针解引用,数组越界等情况。这个错误出现在while循环这一句:while 循环如果这么写,那么,在检查栈是否为空之前,就已经尝试从栈顶取值,这是有问题的。当栈为空时,这将会导致未定义行为。非空操作的判定必须写在前面,才能防止栈顶已经为空的时候出

2023-08-02 20:46:42 550

原创 算法专题:子序列系列2(回文,区间DP)

判断字符串S是否是回文,如果我们知道 s[1],s[2],s[3] 这个子串是回文的,那么只需要比较 s[0]和s[4]这两个元素是否相同,如果相同的话,这个字符串s 就是回文串。如果做了很多这种子序列相关的DP题目,在定义dp数组的时候 很自然就会想题目求什么,我们就如何定义dp数组。遍历顺序同上一题,i是倒序遍历,j是正序遍历,且j>i(本题不是j>=i了,因为长度累加+2)本题是不连续的,但是DP数组依然是按照回文系列定义[i,j]区间的方式来定义。的状态,因此i的状态要通过i+1来推出。

2023-08-01 22:54:21 354

原创 算法专题:子序列系列1

关于两个序列之间的问题,为了简化初始化,DP数组的定义一般为:以下标i - 1为结尾的A,和以下标j - 1为结尾的B待求量为dp[i][j]。也就是说会存在错位,i和j的范围是。这个错位操作的目的主要是为了简化初始化DAY52:动态规划(十七)子序列问题:最长递增子序列+最长连续递增序列+最长重复子数组_大磕学家ZYX的博客-CSDN博客如果要求的子序列是连续的子序列,那么DP数组含义一定是“以nums[i]为结尾的序列,待求量为dp[i]”如果不连续但是i+1需要用到i的状态进行判断,例如。

2023-08-01 22:53:13 248

原创 D356周赛复盘:滑动窗口+三元问题思路

文章目录2798.满足目标工作时长的员工数目完整版2799.统计完全子数组的数目(滑动窗口)思路完整版2800.包含三个字符的最短字符串(复用思路与三元问题思想)思路复用减少字符串长度的思路为什么一次性操作两个字符串完整版进一步理解”三元问题一次只操作两个字符串“复用逻辑2798.满足目标工作时长的员工数目公司里共有 n 名员工,按从 0 到 n - 1 编号。每个员工 i 已经在公司工作了 hours[i] 小时。公司要求每位员工工作 至少 target 小时。给你一个下标从 0 开始、长度为 n

2023-07-31 16:23:23 131

原创 DAY53:动态规划(十八)最长公共子序列+不相交的线+最大子序列和

本题最重要的是,理解当两个序列找不连续的重复子序列时,如果遍历到的两个元素数值不等,那么只需要对dp[i-1][j]和dp[i][j-1]取最大值,之前错位的相等情况就会一层层转移到当前位置!i是nums1的数组下标j是nums2的数组下标dp[i][j]是在两个数组里面分别取值,一定要搞清楚这一点!这道题目用贪心也很巧妙,动规的方法比较直接。

2023-07-28 14:01:00 146

原创 DAY52:动态规划(十七)子序列问题:最长递增子序列+最长连续递增序列+最长重复子数组

本题的最大值并不在dp数组末尾,因为每个数据都可能比前面的数字要小。最大长度可能是dp数组中间位置的dp[i],所以需要建个result存最大值。初始化要注意,本题每个以i为结尾的递增子序列,长度最小是1而不是0!本题难点在于,比较两个数组,得到重复且连续的最长子数组,用一维的DP数组无法同时表示两个数组的状态。我们需要用一个二维的矩阵来比较两个数组的所有状态。dp[0][j]和dp[i][0]的情况都需要单独初始化。

2023-07-26 15:27:37 714

原创 DAY52:动态规划(十六)买卖股票最佳时机含冷冻期/手续费+股票系列总结

冷冻期这道题,关键是要想到拆分之前题目中的,不持有股票这个状态下的两种情况,即为本来就不持有和当天刚刚卖出。因为当天刚刚卖出这种情况,会导致冷冻期。因此,当天刚刚卖出应该单独拆分为一个状态由该状态导致的冷冻期应该拆分为另一个状态。核心点还是理解状态转移的思想。本题和买卖股票Ⅱ很像,多了手续费,手续费是每次交易只需要一次,因此交易结束的时候上交。冷冻期>K次交易>两次交易>手续费,重点是理解状态转移。K次交易是仔细分析状态转移;冷冻期是分清楚每个状态,对普通状态进行拆分;

2023-07-26 15:16:29 104

原创 Line 15: Char 5: error: non-void function does not return a value in all control paths [-Werror,-Wre

这个错误出现在lengthOfLIS函数中。在for循环内部使用了return语句,导致只有在for循环第一次迭代时才会返回值,如果for循环没有执行,那么函数就不会有返回值。,这在C++中是不允许的。每个非void函数都必须在所有可能的执行路径下都有返回值。return res位置移动到外面就好了。

2023-07-25 20:09:07 1086

原创 DAY51:动态规划(十五)买卖股票最佳时机Ⅲ+买卖股票最佳时期Ⅳ

DP数组的初始化问题一定要注意,并不是所有的问题都会直接初始化为0i代表的含义是下标i,而不是天数i下标0的时候,实际上代表的是第一天!i的范围是dp[0]实际上代表的是第1天持有股票时手里现金的状态。初始化主要是看dp[0]的时候对应的输入数组是不是有取值(同 198.打家劫舍 系列)当限制了买卖次数,我们又不能从递推公式看出本次买卖是第几次买卖的时候,就只能把每一次买卖的状态都列出来,新的一次买卖一定是在上一次买卖状态的基础上,进行状态转移!

2023-07-25 20:06:03 143

原创 DAY51:动态规划(十五)买卖股票最佳时机Ⅲ+买卖股票最佳时期Ⅳ

DP数组的初始化问题一定要注意,并不是所有的问题都会直接初始化为0i代表的含义是下标i,而不是天数i下标0的时候,实际上代表的是第一天!i的范围是dp[0]实际上代表的是第1天持有股票时手里现金的状态。初始化主要是看dp[0]的时候对应的输入数组是不是有取值(同 198.打家劫舍 系列)当限制了买卖次数,我们又不能从递推公式看出本次买卖是第几次买卖的时候,就只能把每一次买卖的状态都列出来,新的一次买卖一定是在上一次买卖状态的基础上,进行状态转移!

2023-07-24 19:31:21 92

原创 DAY50:动态规划(十四)买卖股票最佳时机+买卖股票最佳时机Ⅱ

给定一个数组 ,它的第 个元素 表示一支给定股票第 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 。示例 1:示例 2:提示:本题是买卖一次股票,也就是说整个过程只能买入一次和卖出一次。最直白的解决思路是暴力枚举,两层for循环,枚举每一个买股票的位置和卖股票的位置。本题目标是找出一段时间内的最大收益。贪心解法如下:时间复杂度:O(n)空

2023-07-24 19:29:18 76

原创 debug记录:解答错误并出现较大数字

得到的 1094795590 这个很大的数字,

2023-07-24 19:21:18 99

原创 debug记录:三目运算符优先级的问题

leetcode 188.买卖股票最佳时机Ⅳ错误代码:出现了解答错误:这段代码查了很久也没有查出问题,最后发现问题出在整个三目运算符的大括号上。在 C++、Java、JavaScript 等语言中,三元运算符 ? : 的优先级低于加法和减法。也就是说先执行加减运算,最后才执行三目运算符!原代码:这种情况下,三元运算符并没有正确地应用在 prices[i] 和 -prices[i] 上,而是应用在了 dp[i - 1][j - 1] + (j % 2 == 0) 和 prices[i] 之间,因为加法操

2023-07-24 19:15:15 148

原创 D355周赛复盘:模拟题*2

本题的思路就是模拟法,可以直接调用c++的getline库函数,getline函数也就是处理输入流字符串的分割,并把分割好的字符串存在第二个参数item中。的情况,例如[5,3,3]和[2,3,4]这样的情况,就是先进行后面的3+4,再把3+4的结果和2相加,得到9。变量的具体处理,例如打印出来,或者存储到其他数据结构中等等,这取决于你的程序需要完成的具体任务。并不正式地被归类为STL容器,但是它在很大程度上是遵循和实现了STL容器的接口和使用方式的。换句话说,它读取的是逗号分隔的一段文本。

2023-07-24 18:59:54 80

原创 std::find操作与stl中find成员函数的区别

这会消耗 O(n) 的时间(其中 n 是被删除元素后面的元素数量)。为了避免这个问题,你可能需要采用不同的策略,例如使用一个额外的数据结构来跟踪哪些元素被删除。在vector中用erase(),推荐用下面的写法:(find找到与nums[i]相等的第一个元素就会返回,不一定是nums[i]本身)此外,当修改 vector 的大小(例如通过调用 erase)时,需要特别注意不能超出其边界。中查找键值为 3 的元素,如果找到,我们打印出该键值。中查找值为 3 的元素,如果找到,我们打印出该元素。

2023-07-24 17:33:32 978

原创 vector的动态扩容机制与下标越界问题

的自动扩容机制并不能防止数组下标越界的问题,需要防止下标越界可以用at()来访问vector元素。即使可以自动扩容,但是访问的元素还是需要确保下标在有效范围内,否则仍然会导致未定义行为。如果访问了中没有初始化的下标,那么可能会遇到任何数值,这是未定义的行为。在C++中,未定义的行为可能会导致程序崩溃,也可能会静默地继续运行,但产生错误的结果。

2023-07-24 15:19:56 1197

原创 CPP幂运算及常用数学函数

但是如果我们想要的是类似(-1)^i,i是奇数的时候结果为-1,i是偶数结果为1,根据 i 的奇偶性来决定一个因子是1还是-1,我们可以直接用。函数,这是C++标准库中的一个函数,可以计算浮点数的幂。,如果直接用来计算整数的幂,由于有。在C++和许多其他编程语言中,在C++中,如果想要计算。pow(a, b) 计算。,不需要担心它会报错。

2023-07-21 19:32:24 1193

原创 DAY49:动态规划(十三)打家劫舍+打家劫舍Ⅱ+打家劫舍Ⅲ(树形DP)

如果这么定义,那么dp数组下标范围就是!代入1–nums.size()-1的例子试一下public ://处理没有dp[0]和dp[1]的特殊情况 if(nums . size() == 0) return 0;//初始化 dp [ 0 ] = nums [ start ];//不能偷相邻的,因此直接是两个nums[]对比 //为了防止start=0的情况需要从start+2开始 for(int i = 2;i ++) {} };

2023-07-20 22:35:51 109

原创 算法专题:投票法

这两个问题之间的主要区别在于正在寻找的元素的数量。在查找主要元素的问题中,出现次数超过了n/2的只可能有一个元素。在这种情况下,当count变为0时可以安全地开始考虑一个新的候选元素,因为不可能有两个元素都出现次数超过n/2。所以当count为0时,可以肯定之前的元素不可能是主要元素,所以重新设置一个候选主要元素是合理的。然而,当寻找的是出现次数超过n/3的元素时,一个数组有可能存在两个这样的元素。所以,不能直接在count为0时就更改候选元素,必须先判断新元素是不是==num1/==num2!

2023-07-20 17:35:57 302

原创 DAY49:动态规划:多重背包理论基础

多重背包在面试中基本不会出现,力扣上也没有对应的题目,对多重背包的掌握程度知道它是一种01背包,并能在01背包的基础上写出对应代码就可以了。

2023-07-20 00:52:43 52

原创 D354周赛复盘:特殊元素平方和+数组最大美丽值(滑动窗口)+合法分割最小下标

当我们直接改成初始值i=1,又会出现结果错误原因是从示例中我们看出,nums[4]是最后一个元素,也就是说本题的下标并不是按照普通数组的形式,而是与数字顺序一致,题目里的数组下标特殊含义也要注意。因此,本题的for循环应该从i=1开始遍历,一直到i=nums.size()。内部求平方和的逻辑直接用nums[i-1]进行计算。投票法是一种用于找出数组中多数元素的算法,这个算法的基本原理是:如果一个元素是数组的多数元素(出现次数超过数组长度的一半),那么即使我们把它和其他每个不同的元素一一抵消。

2023-07-19 21:54:41 1111

原创 DAY48:动态规划(十二)完全平方数(类似零钱兑换)+单词拆分(注意背包思路!)

本题的重要注意点就是,不要局限于判断数字(物品)是不是完全平方数,物品本身的限制条件并不复杂,完全可以直接在递推公式里面进行替换,也就是把递推公式换成这道题目的关键在于正确理解dp数组的含义。在这个代码中,dp[j]表示字符串s的前j个字符是否可以用wordDict中的词语拆分。完全背包的做法是建立哈希表,找挨个增加长度的过程中,字符串的末尾元素。看字符串里符合单词长度的末尾元素能不能在字典里找到,能找到则[i-j]这一段为true,如果dp[i-j]也是true,那么dp[i]就是true。

2023-07-19 03:11:41 217

原创 DAY48:动态规划(十一)爬楼梯(进阶版)+零钱兑换(理解DP数组“装满“含义)

本题看起来是一道简单题目,稍稍进阶一下其实就是一个完全背包。面试可能的情况是,先给候选人出一个爬楼梯原题,再出本题,看其表现,如果顺利写出来,进而在要求每次可以爬[1 - m](这里的意思是每次可以爬的台阶是{1,2……m},要注意确认意图)个台阶应该怎么写。顺便再考察一下两个for循环的嵌套顺序为什么target放外面,nums放里面。这就能考察对背包问题本质的掌握程度,候选人是不是刷题背公式,一眼就看出来了。递推公式:因为求的是个数,所以,把完全背包的递推公式,物品value值改为1即可。

2023-07-19 03:08:35 95

原创 DAY47:动态规划(十)零钱兑换Ⅱ+组合总和Ⅳ(完全背包求方案总数类型,排列+组合)

完全背包问题,在求装满背包有几种方案的时候,认清遍历顺序是非常关键的。如果求所有装满背包方案的组合数,就是外层for循环遍历物品,内层for遍历背包。如果求所有方案的排列数,就是外层for遍历背包,内层for循环遍历物品。01背包因为物品和背包遍历顺序不能颠倒,所以并不存在排列数和组合数的问题。如果面试问到for嵌套顺序颠倒计算排列数和组合数的原理,可以这么回答:物品在外的话,必须考虑完 i 的所有情况之后再考虑 i + 1,所以去掉了他们的排列关系;而。

2023-07-14 20:51:33 278

原创 DAY47:动态规划(九)完全背包理论基础

注意,全文说的都是对于纯完全背包问题其for循环的先后循环是可以颠倒的!但如果题目稍稍有点变化,就会体现在遍历顺序上。如果问装满背包有几种方式的话,那么两个for循环的先后顺序就有很大区别了。如果我们先遍历背包后遍历物品,得到的就是方案的排列数;先遍历物品再遍历背包,得到的就是方案组合数。518.零钱兑换Ⅱ377.组合总和Ⅳ中进行进一步的理解。【总结】用树形图和剪枝操作理解完全背包问题中组合数和排列数问题_先遍历物品后遍历背包是组合数_Calculus2022的博客-CSDN博客。

2023-07-14 20:47:47 158

原创 DAY46:动态规划(八)01背包应用2:一和零(二维容量01背包)

01背包问题纯 0 - 1 背包 是求给定背包容量,背包的最大价值是多少。分割等和子集 是求给定背包容量,能不能装满这个背包。最后一块石头的重量 II 是求给定背包容量,尽可能装,最多能装多少。目标和 是求给定背包容量,装满背包一共有多少种方案。474.一和零 是求给定背包容量,装满背包最多有多少个物品。(本题属于二维容量的背包)

2023-07-14 15:34:02 123

原创 DAY46:动态规划(七)01背包应用:分割等和子集+最后一块石头重量Ⅱ+目标和

这道题目就是一道01背包应用类的题目,需要我们拆解题目,然后套入01背包的场景。01背包相对于本题,主要要理解,题目中物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。第一种写法是重量=价值的写法,相对来说好理解一些。需要注意的一点就是重量=价值,那么dp[j]代表的最大价值,一定<=j(最大重量),因为背包问题的大前提就是,放入背包的所有物品最大重量一定<=背包容量。有一堆石头,用整数数组 stones 表示。其中stones[i]表示第 i 块石头的重量。

2023-07-14 03:33:36 208

原创 DAY45:动态规划(六)背包问题优化:一维DP解决01背包问题

背包最大重量为4。物品重量和价值为:问背包能背的物品最大价值是多少?在我们使用二维DP数组的时候,递推公式是.如果要降为一维DP数组,就是用来表示递推。这里用j是为了j的含义和二维DP数组保持一致,下标含义都是背包的容量。原始的二维DP状态转移方程是:。这个方程意味着,对于第i个物品和当前背包容量j,我们要么选择放入这个物品,要么不放。如果放入这个物品,就需要看在容量为时,放入前i-1个物品的最大价值(也就是),如果不放入这个物品,就是。然后取这两者之间的最大值。二维背包DP数组情况示例如下图所示。我们

2023-07-12 20:09:05 438

原创 DAY45:动态规划(五)背包问题:01背包理论基础+二维DP解决01背包问题

对于每一种物品(纵轴上的索引i),对于每一个背包大小(横轴上的索引j),都计算出当前背包大小能存放物品的最大价值。如果当前背包的容量无法装下物品i,那么dp[i][j]的值就等于dp[i-1][j],否则,需要在“不放入物品i”和“放入物品i”这两种选择中选取价值最大的,即。这样,遍历到指定背包大小的时候,得到的就是当前背包可以装下物品的最大价值。所以说,这个DP递推公式对于每一个背包数值都适用。我们需要时刻注意,遍历到每一个物品的时候,dp[i][j]

2023-07-12 20:03:58 234

原创 DAY44:动态规划(四)整数拆分(递归+DP递推都可以做,注意区别和理解)

递归做法更加直观也更好理解,核心就是枚举从1–n的所有i和n-i的乘积结果,找到最大值。(实际上枚举1–n/2即可,i和n-i后半段是重复的)但是这种做法,dfs(n-i)的拆分里会有大量的重复拆分,例如dfs(5)这个数值,遍历到dfs(9),dfs(8),dfs(7)的时候都会再拆一遍,造成大量时间消耗,会超时。因此需要靠记忆化搜索进行防止重复拆分的操作,用memo数组存下每一次拆分的最终结果dfs(n)。递归之前检查如果memo数组有这个dfs(n),直接返回memo存的结果。

2023-07-11 15:58:03 847

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除