
DP训练
文章平均质量分 56
面对DP的恐惧
Angindem
"我们都在吸进灰尘,可不妨碍我们做的好一些啊"
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
dp专题18 最长上升子序列
本题链接:晴问算法 根据题目意思,求出最长上升子序列,不是递减的序列。 从中,由于是上升的子序列,所以我们只能从头到尾的选取。 这里我们明确一下 dp[ i ] 的含义,由于我们是从头到尾的选取,寻找最长的上升子序列,所以我们确定 dp[ i ] 含义就是当前下标 i 的最长上升子序列长度是多少。其中 i 就是原数组的下标位置。 所以得出一个 for 循环 又因为我们是从头到尾的一个一个进原创 2024-01-27 13:41:27 · 359 阅读 · 0 评论 -
DP专题17 单词拆分
本题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 由题意,根据题目意思,给出字符串 S,以及一个字符串数组,问字符串数组中 是否可以任取字符串拼成字符串 S。 根据这个题目,我们可以看成完全背包问题,又因为我们选取的字符串 可以不在乎顺序的进行选取,所以我们用 排列数的遍历方式,总结下来: 完全背包问题+排列数遍历方式 这里题目要求的是判断是否可以拼成字符串 S, 所以我们 dp 数组可以为 bool 类型的dp数组,原创 2024-01-22 21:38:03 · 864 阅读 · 0 评论 -
dp专题16 完全平方数
本题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 这道题与 前面写的零钱兑换一样的思路,只不过,这里需要我们自己添加物品。原创 2024-01-19 17:37:34 · 452 阅读 · 0 评论 -
dp专题15 零钱兑换
本题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 这道题,是个比较模板的完全背包问题,这里要求的是问凑成总金额所需的最少的硬币的个数。我们明确一下 dp[ i ] 的含义,是 dp[ i ] 存储的是凑成总金额所需的最少的硬币的个数。其中 下标 i 的含义是 "背包容量" amount , 并且不同金额中是有无限个的。所以我们可以将,不同金额硬币作为"物品体积",每个硬币价值都为 1 表示物品的数量。其次我们也要分析 dp 数组的初始化,由于 要求所需最少的硬币个原创 2024-01-19 17:01:37 · 466 阅读 · 0 评论 -
dp专题14 爬楼梯(进阶)
本题链接:题目页面 输出 3 这是个 完全背包 + 排列数选取方法的dp问题。需要注意的是初始化 0 和 1 都为 1.原创 2024-01-18 12:26:46 · 448 阅读 · 0 评论 -
dp专题13 零钱兑换II
本题链接:. - 力扣(LeetCode) 根据题意,这是一道很裸的背包问题,其中这里是返回 背包方案数 的。我们可以直接推出公式 : dp [ j ] += dp[ j - coins[ i ] ]在我之前做的笔记中,写过具体的背包方案数dp公式,参考我之前的详解即可:dp专题10 目标和 最后我们再明确一下题目,题目要求是 硬币数量是无限的,说明这是一个 完全背包问题。完全背包问题 和 01 背包问题区别在于 遍历背包的顺序。01 背包的 背包 遍历顺序: 逆向。完全背包的 背包原创 2024-01-16 15:36:22 · 408 阅读 · 0 评论 -
dp专题12 多重背包问题的二进制优化
本题链接:5. 多重背包问题 II - AcWing题库 对于朴素版的多重背包问题DP,由于朴素版的多重背包问题DP是三层循环,所以合适范围数据范围是在100左右,当数据范围再多 一个 10倍的时候,朴素版的多重背包问题就会 TLE 了。 朴素版的多重背包问题,原理的三层循环中,有一层循环是作为取多少个当前这个物品的原理,达到完成dp状态的转移。 我们二进制优化这个朴素版的多重背包问题,就是优化掉我们 取多少个当前这个物品 的这一层循环。原创 2024-01-15 17:59:01 · 478 阅读 · 0 评论 -
dp专题8 1049. 最后一块石头的重量 II
本题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 由题意,石头的相撞,求最后相撞后剩余的最后一个石头最小的重量是多少。看到题目的这里,都往取哪些石头的方式去想了,我们不如换个思路,将这堆石头分成两堆,其中一堆尽可能的石头之和,为总石头之和的一半那边靠,然后将这两堆石头相撞,剩余的就一定是重量最小的石头了。 所以归根结底,还是背包问题,将 总石头之和的一半作为背包容量,另一堆重量 为 sum - dp[sum / 2]; 最后相减即可。原创 2024-01-03 15:12:40 · 465 阅读 · 0 评论 -
dp专题7 分割等和子集
本题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台由题意,题目意思是给出 数组 nums 找出两个子集它们的元素和相等。这里两个自己的元素和相等,说明需要 数组 nums 总和可以平分,即 sum % 2 == 0又因为子集不要求我们所取的元素是连续的,这里只有取或不取,所以我们试着取联想以下 01 背包其中 容量是 我们的 sum / 2 ,只要我们取的 nums 元素之和 刚好满足 sum / 2 即可,所以我们的 元素中的 价值 和 体积 都是 nums[] 元素值原创 2024-01-02 15:55:32 · 429 阅读 · 0 评论 -
dp专题6 整数拆分
本题链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 对于整数拆分,就是多个子问题,我们通过解决一个子问题,来推出大问题,我们拆分的时候,按照逻辑一个数拆成两个数,比如: 6 = 2 + 3 或者 6 = 1 + 5 或者 6 = 3 + 3 ...等,其中 拆分了一个数之后,如果拆分得到的数不为 1 说明还是可以拆分,所以这时候我们可以得到了子问题的特征了,即 dp[N] 中 dp 的下标含义应该是什么, 我们dp下标的含义应该指向我们拆分的数,其中 dp[下标] 元素原创 2024-01-02 14:46:34 · 943 阅读 · 0 评论 -
DP专题5 不同路径||
这道题,思路跟 不同路径| 思路一样,只是不同的是,有障碍物这一块,我们的二维dp数组初始化的时候,要注意,机器人只能向右和向下,所以初始化第一行和第一列的时候,当遇到障碍块的时候,就后面初始化就是 0,障碍块前面是1。而当障碍块在二维地图内的时候,我们dp该位置应该跳过该障碍块的方法,即dp[][]障碍块中应该是 0。原创 2023-09-15 12:02:32 · 82 阅读 · 0 评论 -
DP专题4 不同路径|
根据题意,我们定义一个二维dp,dp 中的 i,j含义就是对应的坐标,dp 是对应坐标的不同路径数量,根据枚举简单数据可以知道。我们首先要初始化,第一行向右的坐标所对应的不同路径数和 第一列向下的坐标的不同路径数都是 1。因为机器人只能 向右和向下。随后根据模拟递推可以知道,递推公式是 dp[i][j] = dp[i - 1][j] + dp[i][j - 1];原创 2023-09-14 15:03:31 · 126 阅读 · 0 评论 -
DP专题3 使用最小花费爬楼梯
根据题意,我们先明确 dp 数组 i 的含义, 这里很明显,可以知道 i 是对应阶梯的最少花费,其次dp初始化中,我们的 dp[0] 和 dp[1] 是 0 花费,这是我们可以选择的,到了 dp[2] 就是我们min(dp[0] + cost[0],dp[1] + cost[1]) 即 这就是 我们的递推公式:达到当前阶梯的最少花费 + 当前阶梯需要的花费 = 到达的目标阶梯即 dp[i] = min(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]原创 2023-09-14 14:36:27 · 121 阅读 · 0 评论 -
DP专题2 爬楼梯|
根据题意,我们先找到对应的 n 阶台阶的方案数是多少。 n = 1 f(n) = 1 n = 2 f(n) = 2 n = 3 f(n) = 3 n = 4 f(n) = 5 n = 5 f(n) = 8 ...... ...... n = n f(n) = f(n - 2) + f(n - 1)所以通过列原创 2023-09-14 14:16:41 · 106 阅读 · 0 评论 -
DP专题1 斐波那契数列II
通过样例 3 ,我们可以看出,将我们所对应的每个步骤进行拆分后,可以知道,每个步骤中都是调用了前面我们计算过的重复计算,所以这里的 dp[i] 中,i 表示 相应的Fbn(i) 的结果,我们记录下来,当下次拆分的时候,需要 Fbn(i) 的时候,返回我们计算过的结果即可。原创 2023-09-14 14:06:08 · 101 阅读 · 0 评论 -
动态规划DP 导言
动态规划(Dynamic Programming 简称DP)是一种解决多阶段决策问题的数学优化方法。它通过将复杂问题划分为若干个子问题,并采用递推的方式求解子问题,最终得到原问题的最优解。动态规划的核心思想是利用已经解决过的子问题的解来求解当前问题,以减少计算量。动态规划广泛应用于各种问题,例如最短路径问题、背包问题、序列比对等。它的优势在于能够将复杂问题拆分为简单的子问题,并且通过存储已解决的子问题的解来避免重复计算,从而提高运算效率。原创 2023-09-14 13:53:17 · 83 阅读 · 0 评论