
动态规划
文章平均质量分 94
float_com
程序员小菜鸟一枚
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【区间dp】-----例题5【田忌赛马】(暂时只会贪心解法)
然而,赛马问题是一种特殊的二分图最佳匹配的问题,上面的算法过于先进了,简直是杀鸡用牛刀。由于齐王总是先出最好的马,再出次好的,所以田忌用常规马对齐王的超级马,用自己的超级马对齐王的上级马,用自己的上级马对齐王的常规马,以两胜一负的战绩赢得。如果不止三匹马怎么办?把田忌的马放左边,把齐王的马放右边。他和齐王都有三匹马:常规马,上级马,超级马。因为如果不打这一场,而是用这匹好马去对齐王的一匹慢马,虽然也能赢,但会浪费这匹快马的优势,可能影响后续更关键的比赛。齐王的马好,同等级的马,齐王的总是比田忌的要好一点。原创 2025-05-29 22:05:31 · 748 阅读 · 0 评论 -
【区间dp】-----例题4【凸多边形的划分】
设dp[i][j]表示从第i个顶点到第j个顶点所构成的子多边形(包含这两个顶点),划分成若干三角形后,其所有三角形顶点乘积和的最小值。注意:这里的i到j是连续编号的顶点,且顺序不变。项目内容算法类型区间动态规划(Interval DP)时间复杂度O(n³)空间复杂度O(n²)核心技巧区间划分 + 最小化三角形乘积和注意事项使用__int128防止溢出类似题目矩阵链乘法、石子合并、最长回文子串。原创 2025-05-26 23:16:16 · 317 阅读 · 1 评论 -
【区间dp】-----例题3【石子合并】[带环]
/ 1.状态定义:// dpmax[i][j]:表示将区间 [i..j] 的石子合并为一堆所能获得的最大代价// dpmin[i][j]:表示将区间 [i..j] 的石子合并为一堆所能获得的最小代价。原创 2025-05-19 22:11:32 · 170 阅读 · 0 评论 -
【区间dp】-----例题2【最长回文子串】
子串(Substring)要求字符连续且顺序不变;例如"aba""bb"都是回文子串。回文(Palindrome)正着读和反着读完全相同;例如"aba""racecar"。给定一个字符串s,找出其中最长的回文子串,并返回其长度。我们使用一个大小为n×n的布尔矩阵dp,其中。// dp[i][j] 含义:子串 s[i..j] 是否为回文// 取值:// dp[i][j] = true, 当且仅当 0 ≤ i ≤ j < n 且 s[i..j] 整体是回文。原创 2025-05-19 20:13:26 · 387 阅读 · 0 评论 -
【区间dp】-----例题1【最长回文子序列】
子序列(Subsequence)从字符串中删除任意个(也可以不删)字符后得到的新字符串;不要求连续,但要求相对顺序不变。回文(Palindrome)正着读 = 反着读;比如:“aabaa”, “abcba”找出字符串中最长的“回文子序列”的长度。dp[i][j]:表示从下标i到j的子串s[i..j]中,最长的回文子序列长度。dp[0][4] 就是求 s[0…4] = “bbbab” 里的最长回文子序列长度枚举区间长度时从小到大,因为小区间是大区间的子结构,必须先算好。原创 2025-05-18 22:32:50 · 838 阅读 · 0 评论 -
【背包dp】小结
多个物品选几个,容量限制是核心;选或不选看约束,价值最大找最优;可重复用正序扫,只能选一次就倒流;多重拆成 0-1 背,分组记得内部分组选。原创 2025-05-18 14:46:46 · 814 阅读 · 0 评论 -
【背包dp-----分组背包】------通天之分组背包【模板】
dp[i][j]表示从前i个物品组中,在总容量恰好为 j 的情况下所能获得的最大价值。外层循环:遍历物品组对于每一个物品组(从第1组开始),获取该组的所有物品。继承上一组的状态在处理当前组之前,先继承前一组的状态(即假设不选择当前组中的任何物品),确保基础状态正确。中层循环:遍历当前组内的每个物品对于当前组中的每一个物品,计算其对背包的影响。最内层循环:遍历背包容量对于当前物品,遍历所有可能的背包容量,并根据当前物品的重量和价值更新dp数组。原创 2025-05-17 21:54:01 · 1096 阅读 · 0 评论 -
【背包dp----01背包】-----划分【01变种---子集划分】
我们定义一个二维布尔数组dp[i][j],表示:前i个物品中,是否可以选出若干个物品,使得它们的总和正好等于ji的范围是[0, 40]j的范围是[0, sum]内容说明核心思想将问题转化为 0-1 背包问题,寻找最接近sum/2的子集DP 数组定义dp[i][j]表示前i个物品能否凑成总和j状态转移or最终答案遍历所有可达的j,取j*(sum-j)的最大值优化建议可以使用滚动数组优化空间,压缩为一维 DP我们定义一个一维布尔数组dp[j],表示:是否可以从前i。原创 2025-05-15 19:17:51 · 967 阅读 · 0 评论 -
【背包dp----完全背包】-----Money System / Cow Cash G【完全变种---求方案数】
dp[i][j]表示从前 i 个物品中任选若干个(可重复选),使得它们的总价值恰好为 j 的方案总数。dp[j]表示:当前处理到第 i 个物品时,总价恰好为 j 的方案数。含义不变:表示从前i个物品中选出若干个,使得总价值恰好为j的组合方式数量。原创 2025-05-13 20:11:20 · 881 阅读 · 0 评论 -
【背包dp----多重背包】-----多重背包【模板】
dp[i][j]表示从前 i 个物品中任选若干个(每个物品最多选 x[i] 次),使得它们的总重量恰好为 j的最大价值。dp[j]:容量为j的情况下,所能获得的最大价值。dp[0] = 0,其余为INT_MIN最终答案:从dp[0]到dp[T]中取最大值。原创 2025-05-12 22:29:25 · 896 阅读 · 0 评论 -
【背包dp----完全背包】------完全背包【模板+恰好装满】
我们定义一个二维数组dp[i][j]表示:前i个物品中选择若干物品(每个物品可选多次),恰好填满体积为j的背包时,可以获得的最大价值。初始状态是整个动态规划过程的起点,表示“不选任何物品,刚好填满体积为 0”的合法状态;其余状态初始化为INT_MIN表示不可达,避免从无效状态进行转移。项目内容题型完全背包动态规划类型二维数组 + 三重暴力循环状态定义dp[i][j]:前i个物品,体积为j时的最大价值状态转移枚举第i个物品选k次的情况关键技巧使用INT_MIN标记无效状态,防止无效转移。原创 2025-05-12 21:48:18 · 105 阅读 · 0 评论 -
【背包dp----01背包】-----不同的总分值【01变种---子集划分】
我们定义dp[i][j]表示前i道题中,经过任意选择,能否恰好得到分数j。如果,说明可以通过选择前i道题中的若干题,得到总分为j。如果,说明不能组成这个总分。项目内容题型子集和问题 / 0-1 背包变种动态规划类型二维布尔数组状态定义dp[i][j]:前i道题能否组成总分为j初始化状态转移关键技巧使用bool数组表示“可达性”,避免冗余计算我们定义dp[j]表示:经过若干选择后,能否得到总分为j。如果,说明可以通过选择一些题目,得到总分为j。如果,说明不能组成这个总分。原创 2025-05-13 22:00:10 · 773 阅读 · 0 评论 -
【背包dp----01背包】-----小A点菜 【01变种--求方案数(恰好装满+不用恰好装满)】
在本题中,我们通过定义dp[i][j]表示前i个物品中选出若干个,总价恰好为j的方案数,利用动态规划的状态转移思想,将每一步的选择(选或不选)转化为数学上的加法运算,从而高效地求解了恰好花完m元的所有合法方案数。原创 2025-05-09 09:11:19 · 598 阅读 · 0 评论 -
【背包dp----01背包】-----01背包【模板+恰好装满产生的最大价值】
dp[i][j] 表示前 i 个物品中选择若干物品,装满容量为 j 的背包中 可以获得的最大价值。这个状态定义规定容量j填满当前背包容量,与标准的01背包问题略有不同✅ 推荐使用隐式初始化(只设置),并从j=0开始遍历,这是最标准、最安全、最通用的做法。✅ 如果你选择从j=1开始遍历(即跳过j=0),那么你就必须显式地设置所有,否则会导致一些本应可达的状态被误判为不可达。dp[i][j] 表示:从前 i 个物品中选择若干物品,使得它们的总体积恰好等于 j,可以获得的最大总价值。原创 2025-05-07 23:04:32 · 620 阅读 · 0 评论 -
【背包dp----01背包】-----携带研究材料【01模版】
我们定义一个二维数组dp[i][j]表示:只考虑在前i个物品中任选一些物品 放入容量为 j 的背包时,能够获得的最大总价值。前 1 个物品,在容量 j 下的最大价值;前 2 个物品,在容量 j 下的最大价值;前 n 个物品,在容量 vs 下的最大价值(这就是我们要求的答案)。步骤内容问题类型0-1 背包问题动态规划类型二维 DP子问题定义dp[i][j]表示只考虑在前i个物品中任选一些物品 放入容量为 j 的背包时,能够获得的最大总价值。状态转移选或不选第i个物品,取最大值。原创 2025-05-07 20:57:12 · 868 阅读 · 0 评论 -
【背包dp----01背包】-----装箱问题【模版简化---体积即价值】
设dp[i][j]表示从前i个物品中选择若干装入体积为j的箱子时,所能使用的最大体积。我们的目标是:找出dp[n][vs],即使用了全部物品后,在体积为vs的箱子中能装下的最大体积,用得到最小剩余空间。步骤内容状态定义dp[i][j]表示从前i个物品中选择若干装入体积为j的箱子时,所能使用的最大体积状态转移当当j < v[i]初始条件第0层根据第0个物品体积初始化最终答案时间复杂度O(n×vs)空间复杂度O(n×vs)设dp[j]表示当前处理到某个物品时,在容量为j。原创 2025-05-06 16:46:12 · 928 阅读 · 0 评论 -
【二维dp】例题1------数字三角形 Number Triangles
设dp[i][j]表示从金字塔顶部走到第i行第j列时的最大路径和。我们的目标是:找出dp[n][j]中的最大值(即最后一行中的最大路径和),其中n是层数。步骤内容状态定义dp[i][j]表示到达第 i 行第 j 列的最大路径和状态转移初始条件最终答案取最后一行的最大值时间复杂度O(n²)空间复杂度O(n²))使用滚动数组优化的一维 DP 数组dp[j]表示:当前处理到第i层时,到达第j列的最大路径和。我们不需要保存每一层的状态,只需要用一维数组模拟即可。项目内容题目。原创 2025-05-05 21:48:38 · 1032 阅读 · 0 评论 -
【动态规划】Day01------基本原理与一般解题步骤
我的状态是什么?我的转移怎么写?我的初态是什么?我的终态在哪里?原创 2025-04-27 09:26:31 · 531 阅读 · 0 评论