代码随想录动态规划part02

动态规划part02

62.不同路径

代码随想录

视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili

递归法

动态规划,当前状态是由上一个状态转化来的

这里初始化错误了,想法是对的右一和下一初值都是1,起点不需要走所以是0,但是在遍历时从起点开始,将右一和下一都清空了,导致整个dp数组值全为0;所以起点位置路径应为1,

dp[0][0] = 1;

//dp[0][1] = 1;

//dp[1][0] = 1;

或者将第一列和第一行都初始化为1,然后从坐标[1,1]开始逐行遍历

63. 不同路径 II

https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.htmlhttps://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.html

视频讲解:动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II_哔哩哔哩_bilibili

后续搞清楚为什么上一题不加条件递推公式不会越界

遇到障碍把该位置dp值初始化为0,优化代码:

  1. 整数拆分

代码随想录

视频讲解:动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili

回溯法 从1开始找出和等于n的组合(可重复)

终止条件

  1. 当和大于n
  2. Sum = n 计算乘积

上述可以优化,不用数组来保存乘积,直接比较每一个乘积结果只留最大值

动态规划

将n拆解成m个大小尽量接近的数值,乘积才会尽可能大

  1. 定义dp数组,dp[i]:数值i对应的最大乘积dp[i]
  2. 递推公式:将i拆出来的第一个数j(j从1开始遍历),dp[i] = j*dp[i-j];
    a) 为什么是dp[i-j]?
  • 拆分的第一个数字是j,还要对i-j继续拆,但是无论对i-j如何进行拆分,找到其对应的乘积最大值dp[i-j],然后*j就得到i在j拆分下的乘积最大值
  • J是从1开始遍历的,这样的话就包含了所有的拆分过程,在这其中找到最大的乘积

b) 为什么还要拆成j*(i-j)

举例说明若n=4,当j = 2,j*dp[j-i]=2*1=2,结果dp[4]=2

同理dp[3] = 1,

  1. dp初始化dp[1] = 0, dp[2]=1
  1. 为什么dp[1] = 0?dp[1] = 1也不妨碍结果
  1. 遍历顺序从3开始逐个拆分到n
  2. Debug
相关推荐
BUG收容所所长17 分钟前
二分查找的「左右为难」:如何优雅地找到数组中元素的首尾位置
前端·javascript·算法
itsuifengerxing1 小时前
python 自定义无符号右移
算法
猎板PCB厚铜专家大族1 小时前
高频 PCB 技术发展趋势与应用解析
人工智能·算法·设计规范
dying_man2 小时前
LeetCode--24.两两交换链表中的结点
算法·leetcode
yours_Gabriel2 小时前
【力扣】2434.使用机器人打印字典序最小的字符串
算法·leetcode·贪心算法
草莓熊Lotso2 小时前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM2 小时前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
CV点灯大师3 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl3 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康3 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting