动态规划经典题目_「动态规划经典算法」本周总结(二)
通知:我已经将刷题指南全部整理到了Github :https://github.com/youngyangyang04/leetcode-master,方便大家在电脑上阅读,这个仓库每天都会更新,大家快去给一个star支持一下吧!
周一
「力扣」动态规划经典面试题:不同路径 中求从出发点到终点有几种路径,只能向下或者向右移动一步。
我们提供了三种方法,但重点讲解的还是动规,也是需要重点掌握的。
dp[i][j]定义 :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
本题在初始化的时候需要点思考了,即:
dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理。
所以初始化为:
for (int i = 0; i
这里已经不像之前做过的题目,随便赋个0就行的。
遍历顺序以及递推公式:
for (int i = 1; i
周二
「leetcode」动态规划经典面试题:不同路径,有障碍 相对于动态规划:不同路径添加了障碍。
dp[i][j]定义依然是:表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
本题难点在于初始化,如果(i, 0) 这条边有了障碍之后,障碍之后(包括障碍)都是走不到的位置了,所以障碍之后的dp[i][0]应该还是初始值0。
如图:
这里难住了不少同学,代码如下:
vector> dp(m, vector(n, 0));for (int i = 0; i
递推公式只要考虑一下障碍,就不赋值了就可以了,如下:
for (int i = 1; i
拿示例1来举例如题:
对应的dp table 如图:
周三
「力扣」动态规划经典面试题:整数拆分,你要怎么拆? 给出一个整数,问有多少种拆分的方法。
这道题目就有点难度了,题目中dp我也给出了两种方法,但通过两种方法的比较可以看出,对dp数组定义的理解,以及dp数组初始化的重要性。
dp[i]定义:分拆数字i,可以得到的最大乘积为dp[i]。
本题中dp[i]的初始化其实也很有考究,严格从dp[i]的定义来说,dp[0] dp[1] 就不应该初始化,也就是没有意义的数值。
拆分0和拆分1的最大乘积是多少?
这是无解的。
所以题解里我只初始化dp[2] = 1,从dp[i]的定义来说,拆分数字2,得到的最大乘积是1,这个没有任何异议!
vector dp(n + 1);dp[2] = 1;
遍历顺序以及递推公式:
for (int i = 3; i <= n ; i++) { for (int j = 1; j
举例当n为10 的时候,dp数组里的数值,如下:
一些录友可能对为什么没有拆分j没有想清楚。
其实可以模拟一下哈,拆分j的情况,在遍历j的过程中dp[i - j]其实都计算过了。
例如 i= 10,j = 5,i-j = 5,如果把j拆分为 2 和 3,其实在j = 2 的时候,i-j= 8 ,拆分i-j的时候就可以拆出来一个3了。
或者也可以理解j是拆分i的第一个整数。
动态规划:整数拆分,你要怎么拆?总结里,我也给出了递推公式dp[i] = max(dp[i], dp[i - j] * dp[j])这种写法。
对于这种写法,一位录友总结的很好,意思就是:如果递推公式是dp[i-j] * dp[j],这样就相当于强制把一个数至少拆分成四份。
dp[i-j]至少是两个数的乘积,dp[j]又至少是两个数的乘积,但其实3以下的数,数的本身比任何它的拆分乘积都要大了,所以文章中初始化的时候才要特殊处理。
周四
我用动态规划,就能找出有多少个不同的二叉搜索树
这道题目还是比较难的,想到用动态规划的方法就很不容易了!
dp[i]定义 :1到i为节点组成的二叉搜索树的个数为dp[i]。
递推公式:dp[i] += dp[j - 1] * dp[i - j]; ,j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量
dp数组如何初始化:只需要初始化dp[0]就可以了,推导的基础,都是dp[0]。
n为5时候的dp数组状态如图:
总结
本周题目已经开始点难度了,特别是动态规划:不同的二叉搜索树这道题目,明显感觉阅读量很低,可能是因为确实有点难吧。
我现在也陷入了纠结,题目一简单,就会有录友和我反馈说题目太简单了,题目一难,阅读量就特别低。
我也好难那,哈哈哈。
但我还会坚持规划好的路线,难度循序渐进,并以面试经典题目为准,该简单的时候就是简单,同时也不会因为阅读量低就放弃有难度的题目!。
录友们看到这是不是得给个Carl点个赞啊[让我看看]。
预告,我们下周正式开始讲解背包问题,经典的不能再经典,也是比较难的一类动态规划的题目了,录友们上车抓稳咯。
我是程序员Carl,个人主页:https://github.com/youngyangyang04
这里每天8:35准时推送一道经典算法题目,我选择的每道题目都不是孤立的,而是由浅入深,环环相扣,帮你梳理算法知识脉络,轻松学算法!
@代码随想录 期待你的关注
我花了半年时间,整理的力扣刷题攻略,已经全部发布在Github上,点击下方链接查看吧!
动态规划经典题目_「动态规划经典算法」本周总结(二)相关推荐
- 用python做简单的题目_「每日一练」巧用python做小学的数学题
原标题:「每日一练」巧用python做小学的数学题 很多的小学问题其实已经比较复杂了,我们运用传统的算法,可能会比较难以理解,这里我们可以巧用Python来完成一些小学题目的计算! 下边我们就一起来看 ...
- rust大油井频率怎么用_「Rust每日新闻」本周精选 • 第二十四期
前言: 从2018年开始,我每天会花1个小时关注Rust社区动态,并且在Rust.CC论坛.tg channel.Steemit.GitHub.语雀订阅都开通了Rust每日新闻,分享我每天的见闻,偶尔 ...
- 博弈论66个经典例子_「百大管理学定律」博弈论Game Theory
博弈论(Game Theory),博弈论是指研究多个个体或团队之间在特定条件制约下的对局中利用相关方的策略,而实施对应策略的学科.有时也称为对策论,或者赛局理论,是研究具有斗争或竞争性质现象的理论和方 ...
- mysql区间算法_「五大常用算法」一文图解分治算法和思想
前言 分治算法(divide and conquer)是五大常用算法(分治算法.动态规划算法.贪心算法.回溯法.分治界限法)之一,很多人在平时学习中可能只是知道分治算法,但是可能并没有系统的学习分治算 ...
- 将文件中所有数读到一个数组中_「数据结构与算法」将5个文件中的一千万年龄合并到一个新文件中...
现在有5个文件,文件里面分别存储着1千万个用户年龄,并且每个文件中的年龄都是有序的(从小到大),现在需要将这5个文件整合到一个文件中,新文件的内容依然要保持有序(从小到大). 初始化数据 1.数据生成 ...
- 【算法数据结构专题】「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(下)
承接上文 承接上一篇文章[算法数据结构专题]「延时队列算法」史上手把手教你针对层级时间轮(TimingWheel)实现延时队列的开发实战落地(上)]我们基本上对层级时间轮算法的基本原理有了一定的认识, ...
- DeepMind | 手撕MuZero算法「AI核心算法」
注:耕智能,深耕AI脱水干货 作者: 饼干Japson 报道:深度强化学习实验室 转载请联系作者 前言 1 算法简介 1.1 背景 1.2 理解算法思想 2 模型图文讲解 2.1 MuZero中模 ...
- 动态规划经典题目_动态规划经典题目:鸡蛋掉落(附视频讲解)
题目: 思路: 先放上视频讲解 动态规划经典题目:鸡蛋掉落https://www.zhihu.com/video/1225199247848513536 纠正:视频里的状态转移方程漏写了一个+1,意思 ...
- 矩阵乘法的经典题目_源自Matrix67_
嘛,都刷一遍好辣. 矩阵 Am∗n A_{m*n}就是一个m行n列的数表. 考虑矩阵的乘法: C=A∗B=∑aik∗bkj C = A * B = \sum a_{ik}*b_{kj} 那么对于矩阵A ...
- java 动态规划找零钱_初探动态规划——LeetCode找零钱问题
1.简介: 在leetcode上刷题的时候,遇到了一道找零钱的动态规划题,后台测试用例很变态,必须把算法优化的很好才能通过.也借此机会好好的研究了一下动态规划.在下小白一个,大神轻喷. 2.题目如下: ...
最新文章
- SpringMVC过程中@RequestBody接收Json的问题 总是报415
- hdu 1213 How Many Tables ([kuangbin带你飞]专题五 并查集)
- 250鲁大师跑分_鲁大师跑分20万起步的闲鱼二手电脑能买么?只要四招轻松告别套路...
- 在windows上实现多个java jdk的共存解决办法
- 【Python学习】 - TensorFlow.keras 不显示epochs进度条的方法
- scrapy获取a标签的连接_Python爬虫 scrapy框架初探及实战!
- 【高斯消元】bzoj1013 [JSOI2008]球形空间产生器sphere
- matplotlib 可视化 —— 定制 matplotlib
- 湿空气性质计算,随笔与学习记录(2.水蒸气分压,含湿量,相对湿度)
- 计算机管理的服务打不开,Windows 系统服务无法打开解决方法+操作命令详解
- 命令方式查找ip地址、Mac地址
- spark写出分布式的训练算法_Spark on Angel
- Vue.js :使用LODOP打印表格文件
- 利用C++求解一元二次方程
- css沿曲线进行动画,jQuery沿贝兹曲线运动动画特效
- org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 1 in XML document from U
- MySQL中json_extract()函数的用法实例
- Synchronization和java内存模型
- qbo_webi: cherry server 有效url
- 如何设置小于12px的像素字体
热门文章
- SimpleFs文件系统初步五(文件的读写)
- 在CentOS6.5上安装/启动PostgreSQL
- Linux内核部件分析 更强的链表klist
- opengl es3.0游戏开发学习笔记2--绘制地月星系
- python 获取文件大小_Python解决女朋友看电影没字幕的需求
- 乘法逆元(ex_gcd和同余定理)
- java里if为真_Excel:如果所有条件都为真,则嵌套的IF语句返回所有真值
- ssm框架返回html,ssm框架controller层返回json格式数据到页面
- java urlconnection cookie_使用HTTPUrlConnection时如何保留cookie?
- 函数最值题目及答案_高考数学攻克压轴题:圆锥曲线取值范围和最值问题解题模型...