「代码随想录」本周学习小结!(动态规划系列四)
相信很多小伙伴刷题的时候面对力扣上近两千道题目,感觉无从下手,我花费半年时间整理了Github项目:leetcode刷题攻略。 里面有100多道经典算法题目刷题顺序、配有40w字的详细图解,常用算法模板总结,以及难点视频讲解,按照list一道一道刷就可以了!star支持一波吧!
周一
动态规划:目标和!要求在数列之间加入+ 或者 -,使其和为S。
所有数的总和为sum,假设加法的总和为x,那么可以推出x = (S + sum) / 2。
S 和 sum都是固定的,那此时问题就转化为01背包问题(数列中的数只能使用一次): 给你一些物品(数字),装满背包(就是x)有几种方法。
- 确定dp数组以及下标的含义
dp[j] 表示:填满j(包括j)这么大容积的包,有dp[i]种方法
- 确定递推公式
dp[i] += dp[j - nums[j]]
注意:求装满背包有几种方法类似的题目,递推公式基本都是这样的。
- dp数组如何初始化
dp[0] 初始化为1 ,dp[j]其他下标对应的数值应该初始化为0。
- 确定遍历顺序
01背包问题一维dp的遍历,nums放在外循环,target在内循环,且内循环倒序。
- 举例推导dp数组
输入:nums: [1, 1, 1, 1, 1], S: 3
bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4
dp数组状态变化如下:
周二
这道题目动态规划:一和零!算有点难度。
不少同学都以为是多重背包,其实这是一道标准的01背包。
这不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。
所以这是一个二维01背包!
- 确定dp数组(dp table)以及下标的含义
dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。
- 确定递推公式
dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);
字符串集合中的一个字符串0的数量为zeroNum,1的数量为oneNum。
- dp数组如何初始化
因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖。
- 确定遍历顺序
01背包一定是外层for循环遍历物品,内层for循环遍历背包容量且从后向前遍历!
- 举例推导dp数组
以输入:[“10”,“0001”,“111001”,“1”,“0”],m = 3,n = 3为例
最后dp数组的状态如下所示:
周三
此时01背包我们就讲完了,正式开始完全背包。
在动态规划:关于完全背包,你该了解这些!中我们讲解了完全背包的理论基础。
其实完全背包和01背包区别就是完全背包的物品是无限数量。
递推公式也是一样的,但难点在于遍历顺序上!
完全背包的物品是可以添加多次的,所以遍历背包容量要从小到大去遍历,即:
// 先遍历物品,再遍历背包
for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = weight[i]; j < bagWeight ; j++) { // 遍历背包容量dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);}
}
基本网上题的题解介绍到这里就到此为止了。
那么为什么要先遍历物品,在遍历背包呢? (灵魂拷问)
其实对于纯完全背包,先遍历物品,再遍历背包 与 先遍历背包,再遍历物品都是可以的。我在文中动态规划:关于完全背包,你该了解这些!也给出了详细的解释。
这个细节是很多同学忽略掉的点,其实也不算细节了,相信不少同学在写背包的时候,两层for循环的先后循序搞不清楚,靠感觉来的。
所以理解究竟是先遍历啥,后遍历啥非常重要,这也体现出遍历顺序的重要性!
在文中,我也强调了是对纯完全背包,两个for循环先后循序无所谓,那么题目稍有变化,可就有所谓了。
周四
在动态规划:给你一些零钱,你要怎么凑?中就是给你一堆零钱(零钱个数无限),为凑成amount的组合数有几种。
注意这里组合数和排列数的区别!
看到无限零钱个数就知道是完全背包,
但本题不是纯完全背包了(求是否能装满背包),而是求装满背包有几种方法。
这里在遍历顺序上可就有说法了。
- 如果求组合数就是外层for循环遍历物品,内层for遍历背包。
- 如果求排列数就是外层for遍历背包,内层for循环遍历物品。
这里同学们需要理解一波,我在文中也给出了详细的解释,下周我们将介绍求排列数的完全背包题目来加深对这个遍历顺序的理解。
总结
相信通过本周的学习,大家已经初步感受到遍历顺序的重要性!
很多对动规理解不深入的同学都会感觉:动规嘛,就是把递推公式推出来其他都easy了。
其实这是一种错觉,或者说对动规理解的不够深入!
我在动规专题开篇介绍关于动态规划,你该了解这些!中就强调了 递推公式仅仅是 动规五部曲里的一小部分, dp数组的定义、初始化、遍历顺序,哪一点没有搞透的话,即使知道递推公式,遇到稍稍难一点的动规题目立刻会感觉写不出来了。
此时相信大家对动规五部曲也有更深的理解了,同样也验证了Carl之前讲过的:简单题是用来学习方法论的,而遇到难题才体现出方法论的重要性!
我是程序员Carl,可以找我组队刷题,也可以在B站上找到我,关注公众号代码随想录来和上万录友一起打卡学习算法,来看看,你会发现相见恨晚!
如果感觉对你有帮助,不要吝啬给一个
图灵丛书的一句话说的很好,Standing on the shoulders of giants,是的,我们一直站在巨人的肩上,我们起步都在沿着他们的轨迹前行,之后慢慢的在前人的开发基础或者规范上写出 ... 不知不觉又到周五,菌菌又带着新功能来啦! 代码搜索功能发布,提升开发效率 开发一个项目,配置参数是必不可少的步骤,而项目规模越大需要配置的参数就越多.怎么样?是不是已经开始头疼了?dengdengde ... 前段时间写过一篇文章 如何排版微信公众号「代码块」,讲的是如何使用浏览器插件 Markdown Here 来排版代码块.虽然用 Markdown Here 排版出来的样式还不错,但存在一个问题,就是代 ... 深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标--人工智能(AI, Artifici ... 最近博主刚开通微信公众号「石佳劼的博客」,被微信公众平台的图文编辑器折腾的不轻,如果文章中包含「代码块」,怎么排版都显得杂乱无章.之前一直用 Markdown 写作,从来没有考虑过排版.样式问题,因为 ... [本文大约1400字,阅读时间5~10分钟] 在<从零开始学习大数据系列(三十八) Hive中的数据库和表>和<从零开始学习大数据系列(四十二)Hive中的分区>文章中,我们已 ... https://www.toutiao.com/a6711317479001424395/ 平常我们所见的深度学习模型,都是输入一个图像或者视频序列,输出分类,分割,目标检测等结果,但是还有一种模型需 ... 原文来源:arXiv 作者:Ashley D. Edwards.Laura Downs.James C. Davidson 「雷克世界」编译:嗯~是阿童木呀.KABUDA.EVA 在强化学习问题中,关 ... 今日学习的文章和视频链接 454文章链接: link 454视频讲解链接: link 383文章链接: link 383视频暂无讲解 15文章链接: link 15视频讲解链接: link 18文章链 ... 题目 题目链接,代码 题目链接,代码 题目链接,代码 题目链接,代码 初见思路 454.四数相加II 直接看了解析,想通的话还是比较好理解的.用一个map来记录两个数组的和以及出现次数, key为i+ ...「代码随想录」本周学习小结!(动态规划系列四)相关推荐
最新文章
热门文章