相信很多小伙伴刷题的时候面对力扣上近两千道题目,感觉无从下手,我花费半年时间整理了Github项目:leetcode刷题攻略。 里面有100多道经典算法题目刷题顺序、配有40w字的详细图解,常用算法模板总结,以及难点视频讲解,按照list一道一道刷就可以了!star支持一波吧!

周一

动态规划:目标和!要求在数列之间加入+ 或者 -,使其和为S。

所有数的总和为sum,假设加法的总和为x,那么可以推出x = (S + sum) / 2。

S 和 sum都是固定的,那此时问题就转化为01背包问题(数列中的数只能使用一次): 给你一些物品(数字),装满背包(就是x)有几种方法。

  1. 确定dp数组以及下标的含义

dp[j] 表示:填满j(包括j)这么大容积的包,有dp[i]种方法

  1. 确定递推公式

dp[i] += dp[j - nums[j]]

注意:求装满背包有几种方法类似的题目,递推公式基本都是这样的

  1. dp数组如何初始化

dp[0] 初始化为1 ,dp[j]其他下标对应的数值应该初始化为0。

  1. 确定遍历顺序

01背包问题一维dp的遍历,nums放在外循环,target在内循环,且内循环倒序。

  1. 举例推导dp数组

输入:nums: [1, 1, 1, 1, 1], S: 3

bagSize = (S + sum) / 2 = (3 + 5) / 2 = 4

dp数组状态变化如下:

周二

这道题目动态规划:一和零!算有点难度。

不少同学都以为是多重背包,其实这是一道标准的01背包

这不过这个背包有两个维度,一个是m 一个是n,而不同长度的字符串就是不同大小的待装物品。

所以这是一个二维01背包!

  1. 确定dp数组(dp table)以及下标的含义

dp[i][j]:最多有i个0和j个1的strs的最大子集的大小为dp[i][j]。

  1. 确定递推公式

dp[i][j] = max(dp[i][j], dp[i - zeroNum][j - oneNum] + 1);

字符串集合中的一个字符串0的数量为zeroNum,1的数量为oneNum。

  1. dp数组如何初始化

因为物品价值不会是负数,初始为0,保证递推的时候dp[i][j]不会被初始值覆盖。

  1. 确定遍历顺序

01背包一定是外层for循环遍历物品,内层for循环遍历背包容量且从后向前遍历!

  1. 举例推导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站上找到我,关注公众号代码随想录来和上万录友一起打卡学习算法,来看看,你会发现相见恨晚!

如果感觉对你有帮助,不要吝啬给一个

「代码随想录」本周学习小结!(动态规划系列四)相关推荐

  1. 「代码家」的学习过程和学习经验分享【转】

    图灵丛书的一句话说的很好,Standing on the shoulders of giants,是的,我们一直站在巨人的肩上,我们起步都在沿着他们的轨迹前行,之后慢慢的在前人的开发基础或者规范上写出 ...

  2. 新功能又来啦!这次是「代码搜索」和视频直播!

    不知不觉又到周五,菌菌又带着新功能来啦! 代码搜索功能发布,提升开发效率 开发一个项目,配置参数是必不可少的步骤,而项目规模越大需要配置的参数就越多.怎么样?是不是已经开始头疼了?dengdengde ...

  3. 如何排版 微信公众号「代码块」之 MarkEditor

    前段时间写过一篇文章 如何排版微信公众号「代码块」,讲的是如何使用浏览器插件 Markdown Here 来排版代码块.虽然用 Markdown Here 排版出来的样式还不错,但存在一个问题,就是代 ...

  4. 「技术选型」深度学习软件如何选择?

    深度学习(DL, Deep Learning)是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标--人工智能(AI, Artifici ...

  5. 如何排版 微信公众号「代码块」

    最近博主刚开通微信公众号「石佳劼的博客」,被微信公众平台的图文编辑器折腾的不轻,如果文章中包含「代码块」,怎么排版都显得杂乱无章.之前一直用 Markdown 写作,从来没有考虑过排版.样式问题,因为 ...

  6. hive 如果表不存在则创建_从零开始学习大数据系列(四十七) Hive中数据的加载与导出...

    [本文大约1400字,阅读时间5~10分钟] 在<从零开始学习大数据系列(三十八) Hive中的数据库和表>和<从零开始学习大数据系列(四十二)Hive中的分区>文章中,我们已 ...

  7. 「模型解读」深度学习网络只能有一个输入吗

    https://www.toutiao.com/a6711317479001424395/ 平常我们所见的深度学习模型,都是输入一个图像或者视频序列,输出分类,分割,目标检测等结果,但是还有一种模型需 ...

  8. 谷歌大脑提出对智能体进行「正向-反向」强化学习训练,加速训练过程

    原文来源:arXiv 作者:Ashley D. Edwards.Laura Downs.James C. Davidson 「雷克世界」编译:嗯~是阿童木呀.KABUDA.EVA 在强化学习问题中,关 ...

  9. 代码随想录算法训练营第七天|454.四数相加II、383. 赎金信、15. 三数之和、18. 四数之和

    今日学习的文章和视频链接 454文章链接: link 454视频讲解链接: link 383文章链接: link 383视频暂无讲解 15文章链接: link 15视频讲解链接: link 18文章链 ...

  10. 代码随想录算法训练营第07天 | 454.四数相加II 、383. 赎金信、315. 三数之和 、18. 四数之和

    题目 题目链接,代码 题目链接,代码 题目链接,代码 题目链接,代码 初见思路 454.四数相加II 直接看了解析,想通的话还是比较好理解的.用一个map来记录两个数组的和以及出现次数, key为i+ ...

最新文章

  1. 智源研究院发布世界首个“机器学习通用数学符号集”
  2. TopCoder SRM 152 div 2 500point
  3. 互联网协议 — OAuth2 第三方授权协议
  4. redis之mq实现发布订阅模式
  5. spring的aware学习
  6. 数组洗牌算法-shuffle
  7. 深度学习中的内存管理问题研究综述
  8. 从串口驱动的移植看linux2.6内核中的驱动模型 platform device platform driver【转】...
  9. javascript按中文首字母排序
  10. 2833 奇怪的梦境 未AC
  11. 苹果录屏没声音_苹果手机扬声器没声音是怎么回事?
  12. java爬取中央气象台天气预报
  13. LDO:低压差线性稳压芯片
  14. 又一GameFi黑马问世,12.22日开启全球IDO
  15. Doom3 引擎渲染管线分析
  16. 全网最全java Springboot对接微信公众号开发平台(可能是最全)!
  17. 黑盒优化技术评测基准RABBO介绍
  18. 送你一个励志故事(转载)
  19. 达观数据超自动化机器人实践分享 | 达观数据产品总监邵万骏
  20. 封装、继承和多态以及抽象类和接口

热门文章

  1. js的浅拷贝与深拷贝
  2. Tomcat开发技术之与HTTP服务器的集成
  3. Json对象直接存取数据库
  4. webbuilder mysql tomcat 安装心得
  5. IIS与ASP.NET Http Runtime Pipeline
  6. C#基础系列:实现自己的ORM(构造我自己的ORM)
  7. python中filter、map、reduce的区别
  8. 19、Flask实战第19天:CSRF攻击与防御
  9. C++类成员空间分配和虚函数表
  10. bzoj4008: [HNOI2015]亚瑟王