
动态规划
文章平均质量分 61
动态规划
@啊哈哈哈哈哈韩
目标是720篇笔记,冲就完了!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【刷题实录之图论】卡码网:97. 小明逛公园(Floyd算法)
小明喜欢去公园散步,公园内布置了许多的景点,相互之间通过小路连接,小明希望在观看景点的同时,能够节省体力,走最短的路径。这个专栏主要是我在刷题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。接下来的 M 行,每行包含三个整数 u, v, w,表示景点 u 和景点 v 之间有一条长度为 w 的双向道路。接下来的 Q 行,每行包含两个整数 start, end,表示一个观景计划的起点和终点。接下里的一行包含一个整数 Q,表示观景计划的数量。原创 2025-03-19 13:59:12 · 436 阅读 · 0 评论 -
【刷题实录之动态规划】leecode121. 买卖股票的最佳时机
(3)dp数组如何初始化:dp[0][1]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][1] -= prices[0],dp[0][0]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][0] = 0。(1)确定dp数组(dp table)以及下标的含义:dp[i][1] 表示第i天持有股票所得最多现金 ,dp[i][0] 表示第i天不持有股票所得最多现金。输入:prices = [7,6,4,3,1]输入:[7,1,5,3,6,4]原创 2025-02-02 20:59:08 · 439 阅读 · 0 评论 -
【刷题实录之动态规划】leecode337. 打家劫舍 III
(如果对下标含义不理解就再回顾一下dp数组的含义),如果不偷当前节点,那么左右孩子就可以偷,至于到底偷不偷一定是选一个最大的,所以:val2 = max(left[0], left[1]) + max(right[0], right[1]),最后当前节点的状态就是{val2, val1};即:{不偷当前节点得到的最大金钱,偷当前节点得到的最大金钱}。(3)确定终止条件:在遍历的过程中,如果遇到空节点的话,很明显,无论偷还是不偷都是0,所以就返回,所以本题dp数组就是一个长度为2的数组。原创 2025-02-02 10:52:36 · 392 阅读 · 0 评论 -
【刷题实录之动态规划】leecode198. 打家劫舍
如果偷第i房间,那么dp[i] = dp[i - 2] + nums[i] ,如果不偷第i房间,那么dp[i] = dp[i - 1],即考虑i-1房,然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。(1)确定dp数组(dp table)以及下标的含义:dp[i],考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。输入:[1,2,3,1]原创 2025-02-02 09:51:58 · 352 阅读 · 0 评论 -
【刷题实录之动态规划】leecode494. 目标和
(2)确定递推公式:装满容量(所能装的重量)为j的背包,可由两个方向推导出来,一种是装入第i个物品,另一种是不装第i个物品,所以dp[j] = dp[j] + dp[j-nums[i]]。(5)举例推导dp数组:dp[j]的数值一定是小于等于j的。(3)dp数组如何初始化:从dp[j]的定义来看,当尚未遍历物品时,dp[0]等于1,即不装入任何物品,剩下的全部初始化为0。(1)确定dp数组(dp table)以及下标的含义:dp[j] 表示 装满容量(所能装的重量)为j的背包的方法数。原创 2025-02-01 22:26:48 · 350 阅读 · 0 评论 -
【刷题实录之动态规划】leecode1049. 最后一块石头的重量 II
如果题目给的价值都是正整数那么非0下标都初始化为0就可以了,如果题目给的价值有负数,那么非0下标就要初始化为负无穷。(2)确定递推公式:本题,相当于背包里放入数值,那么物品i的重量是nums[i],其价值也是nums[i]。(1)确定dp数组(dp table)以及下标的含义:dp[j] 表示 容量(所能装的重量)为j的背包,所背的物品价值最大可以为dp[j]。组合 7 和 8,得到 1,所以数组转化为 [2,1,1,1],组合 2 和 1,得到 1,所以数组转化为 [1,1,1],原创 2025-02-01 09:26:36 · 372 阅读 · 0 评论 -
【刷题实录之动态规划】leecode416. 分割等和子集
如果题目给的价值都是正整数那么非0下标都初始化为0就可以了,如果题目给的价值有负数,那么非0下标就要初始化为负无穷。(2)确定递推公式:本题,相当于背包里放入数值,那么物品i的重量是nums[i],其价值也是nums[i]。所以递推公式:dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);(1)确定dp数组(dp table)以及下标的含义:dp[j] 表示 容量(所能装的重量)为j的背包,所背的物品价值最大可以为dp[j]。这是 背包算法可以解决的经典类型题目。原创 2025-01-31 23:13:10 · 144 阅读 · 0 评论 -
【刷题实录之动态规划】01背包基础
放物品i:背包空出物品i的容量后,背包容量为j - weight[i],dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]且不放物品i的最大价值,那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值。因此递推公式为dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i])。输出一个整数,代表小明能够携带的研究材料的最大价值。原创 2025-01-31 22:44:48 · 714 阅读 · 0 评论 -
【刷题实录之动态规划】leecode63. 不同路径 II
(3)dp数组如何初始化:因为从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑网格中有障碍物。(1)确定dp数组(dp table)以及下标的含义:dp[i][j] 表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。(2)确定递推公式:dp[i][j] = dp[i - 1][j] + dp[i][j - 1],但要注意当有障碍时,dp[i][j] = 0。原创 2025-01-29 18:24:51 · 392 阅读 · 0 评论 -
【刷题实录之动态规划】leecode62. 不同路径
(2)确定递推公式:想要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1],因此dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。问总共有多少条不同的路径?(1)确定dp数组(dp table)以及下标的含义:dp[i][j]表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。(4)确定遍历顺序:dp[i][j]由其左方和上方推来,因此要从上至下、从左至右遍历。原创 2025-01-29 17:58:05 · 416 阅读 · 0 评论 -
【刷题实录之动态规划】leecode746. 使用最小花费爬楼梯
dp[i - 1] 跳到 dp[i] 需要花费 dp[i - 1] + cost[i - 1]。dp[i - 2] 跳到 dp[i] 需要花费 dp[i - 2] + cost[i - 2]。一定是选最小的,所以dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);(3)dp数组如何初始化:只初始化dp[0]和dp[1]就够了,其他的最终都是dp[0]、dp[1]推出,所以初始化 dp[0] = 0,dp[1] = 0。原创 2025-01-29 12:59:22 · 279 阅读 · 0 评论 -
【刷题实录之动态规划】leecode70. 爬楼梯
(2)确定递推公式:dp[i] 可以有两个方向推出来,首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,再一步跳一个台阶就是dp[i];还有dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,再一步跳两个台阶就是dp[i],dp[i]是 dp[i - 1]与dp[i - 2]之和;(1)确定dp数组(dp table)以及下标的含义:爬到第i层楼梯,有dp[i]种方法;(3)dp数组如何初始化:dp[1] = 1,dp[2] = 2;1 阶 + 1 阶 + 1 阶。原创 2025-01-29 12:30:58 · 246 阅读 · 0 评论 -
【刷题实录之动态规划】leecode509. 斐波那契数
也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n)。(2)确定递推公式:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];解释:F(2) = F(1) + F(0) = 1 + 0 = 1。解释:F(3) = F(2) + F(1) = 1 + 1 = 2。解释:F(4) = F(3) + F(2) = 2 + 1 = 3。(3)dp数组如何初始化:确定dp[0]和dp[1];原创 2025-01-29 11:05:14 · 288 阅读 · 0 评论 -
【刷题实录之动态规划】动态规划基础知识
做动规的题目,写代码之前一定要把状态转移在dp数组的上具体情况模拟一遍,心中有数,确定最后推出的是想要的结果。如果打印出来和自己预先模拟推导是一样的,那么就是自己的递归公式、初始化或者遍历顺序有问题了。:简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的,动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的,这个专栏主要是我在刷题的过程中总结的一些笔记,因为我学的也很一般,如果有错误和不足之处,还望大家在评论区指出。原创 2025-01-27 21:02:44 · 305 阅读 · 0 评论