- 博客(8)
- 收藏
- 关注
原创 背包问题,包含01背包和完全背包
遍历顺序如果不懂的可以画图,遍历顺序一般都是通过递推公式推出来的,从哪个状态转移到那个状态是不同的,因此遍历顺序不是乱写的。初始化则是根据遍历顺序来进行弥补的,因此初始化可以通过dp数组的定义弥补,也可以通过遍历顺序来进行弥补(因为你想要递推你肯定得有第一个值吧?你自己定义符合dp数组的第一个值就是初始化)。最后动归五部曲也是思考的一个方式。先确定dp数组的含义,再考虑根据dp数组的含义如何进行dp数组的递推,然后是递推的第一个值(也不一定是第一个,也可能是第一批)应当如何选择(如何初始化),最后是思考。
2024-05-24 22:20:26 622 1
原创 回溯算法的通用流程(重点为剪枝去重)
说明:将回溯算法解决的问题表示为二叉树形式,。每次进入backtracking时,都相当于进入了一个节点。需要判断是否符合最后需要求的结果。if用来判断处理结果。然后开始进行横向遍历(树层遍历)。在处理完本层的节点后,进入了backtracking(即进入了下一层),从下一层返回到上一层时,需要对从下一层返回来的结果进行回溯,撤销在下一层backtracking处理的结果。即图中蓝色线条的路径。
2024-05-30 15:40:32 1035
原创 买卖股票的最佳时机1&2&3&4
预计周六笔者会整理一下01背包问题和完全背包问题的遍历顺序。后续还会有二叉树的遍历方式和回溯的遍历方式(其实二叉树和回溯的遍历都是一样的,回溯问题都可以变成一个二叉树的问题,来源于代码随想录)代码随想录的代码会更简洁一些,这里只是笔者觉得较为清晰的思路。笔者这里是用数组的两维表示第几次买卖的状态,其实按照代码随想录,只用一维表示状态即可。如下的几个方法在代码随想录都会有更简洁的写法,这里主要考虑的是动态规划的思路。买卖股票的最佳时机1。买卖股票的最佳时机2。买卖股票的最佳时机3。买卖股票的最佳时机4。
2024-05-22 23:41:27 211 1
原创 打家劫舍1&2
改进,注意一点,dp数组改进到长度为3时,这里的代码如果传入的数组长度为2就不好计算了,可以参考代码随想录打家劫舍2的遍历顺序,将dp数组的值传入顺序改为z到y,z赋值,y到x,本质上差不多,但是更简洁。改进:由于递推中 dp[ i ] 的状态只和 dp[ i - 1 ] 和 dp[ i - 2 ] 有关,因此可以只需要一个长度为3的数组保存变量遍历即可。动态规划直接用 dp 数组,dp 数组表示偷到第 i 家时的最大获利。
2024-05-22 10:57:11 220
原创 分割等和子集二维数组方式
后面会出关于遍历顺序的思考,比如什么时候可以先遍历物品?遍历至第 i 个物品时,当背包剩余容量 j 不够存放当前物品 i 的重量 weight[ i ] 时,最大value就为上个时刻的value。此处的初始化较为简单,左列:固定背包容量为 0 时,无法放物品 0 - i ,即value = 0。最上行:固定物品0,背包不同容量时只能存放1个物品0,value = weight[ 0 ]反之,存放入物品 i 的最大value 和 上一时刻的 value比较, 取最大值。1、考虑dp数组的含义。
2024-05-21 11:03:29 208
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人