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

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

这里初始化错误了,想法是对的右一和下一初值都是1,起点不需要走所以是0,但是在遍历时从起点开始,将右一和下一都清空了,导致整个dp数组值全为0;所以起点位置路径应为1,
dp00 = 1;
//dp01 = 1;
//dp10 = 1;
或者将第一列和第一行都初始化为1,然后从坐标1,1开始逐行遍历
63. 不同路径 II
视频讲解:动态规划,这次遇到障碍了| LeetCode:63. 不同路径 II_哔哩哔哩_bilibili

后续搞清楚为什么上一题不加条件递推公式不会越界
遇到障碍把该位置dp值初始化为0,优化代码:

- 整数拆分
视频讲解:动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili
回溯法 从1开始找出和等于n的组合(可重复)
终止条件
- 当和大于n
- Sum = n 计算乘积

上述可以优化,不用数组来保存乘积,直接比较每一个乘积结果只留最大值
动态规划
将n拆解成m个大小尽量接近的数值,乘积才会尽可能大
- 定义dp数组,dpi:数值i对应的最大乘积dpi
- 递推公式:将i拆出来的第一个数j(j从1开始遍历),dpi = j*dpi-j;
a) 为什么是dpi-j?
- 拆分的第一个数字是j,还要对i-j继续拆,但是无论对i-j如何进行拆分,找到其对应的乘积最大值dpi-j,然后*j就得到i在j拆分下的乘积最大值
- J是从1开始遍历的,这样的话就包含了所有的拆分过程,在这其中找到最大的乘积
b) 为什么还要拆成j*(i-j)
举例说明若n=4,当j = 2,j*dpj-i=2*1=2,结果dp4=2
同理dp3 = 1,
- dp初始化dp1 = 0, dp2=1
- 为什么dp1 = 0?dp1 = 1也不妨碍结果
- 遍历顺序从3开始逐个拆分到n
- Debug