![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 58
11
不 彳亍
这个作者很懒,什么都没留下…
展开
-
动态规划之背包问题
(随时更新)AcWing 11. 背包问题求方案数/*i, j, k : 前i个物品中,选了若干件,其体积小于等于j,且价值为k的所有方案。属性:数量集合划分:包含i:其数量等于dp{i - 1, j - vi, k - wi}不包含i:其数量等于dp{i - 1, j, k}dp[i][j][k] = dp[i - 1][j - vi][k - wi] + dp[i - 1][j][k];体积太大,会MLE。yxc做法:dp[i][j]集合描述 : 前i个物品中,选择了原创 2021-05-19 17:00:05 · 75 阅读 · 0 评论 -
动态规划之初始化与遍历
初始化一直是我比较困惑的地方。根据总结,我发现了以下规律:先明白,不合法的集合:根据集合的文字描述,不符合语义的集合。279. 自然数拆分{i, j}: 在前i个数中,选择了若干数,其和为j的所有方案。属性:方案数。那么{0, 1}的文字描述,就是不选数的情况下,和为1的所有方案。该集合肯定是不合法的集合,因此,应该被认为是空集。有些合法的集合,根据题目给定的样例不同,也可以是空集。既然是空集,那么如果是和的最大值,它的属性就应该被赋值为一个不可能在题目中可能出现的和的数。如果是方案数,原创 2021-05-18 18:30:56 · 472 阅读 · 0 评论 -
动态规划之线性DP
最长上升子序列模型最长上升子序列模型有些题目,要求你求出一个最佳序列。这个序列的元素不一定是数。分级先要知道一个定理:B序列的所有元素肯定都在A序列中出现过。在得到答案的算法推进过程中,我们要暴力枚举出所有的B序列。在暴力枚举所有B序列的过程中,也会枚举出一些中间序列(类似于dfs中的状态节点)。将这些序列按某一特征进行划分。集合:{i, j}:与A[1……i]配对,且以A1[j]结尾的B序列。(A1[j]是排序好的A序列)属性:dp[i][j] : MIN S集合划分:遮掉A[j],原创 2021-05-09 16:46:18 · 100 阅读 · 0 评论 -
动态规划之数字三角形模型
题目给你一个二维数组(每一行的列数不一定相等)。让你求出一条最佳路径。dp[i][j] : 从(1, 1)走到(i, j)的所有路径集合。属性:MAXSUM集合划分:按照路径的倒数第二个值进行子集划分。先把集合中的所有路径的(i, j)给遮住,然后将这些路径按照路径的最后一个点是否相等划分到不同的集合。在把(i, j)加上,就把所有的路径都给划分好了。求属性:我们要求{i, j}集合里的所有路径的最大值,等价于求所有子集的最大值。对{i, j}划分好的一个子集G,它包含的所有路径,肯定是从(1原创 2021-05-09 16:43:18 · 110 阅读 · 0 评论 -
动态规划之最长上升子序列模型
有些题目,让求给定序列的最*** 的 ***序列。五一到了,ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号。同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了。队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么?题目让求最长的子序列,该子序列满足单调递增或者先递增后递减或者递减。我们要得到最长的子序列,就需要枚举出所有原创 2021-05-07 21:09:11 · 141 阅读 · 1 评论 -
ACWing 96. 奇怪的汉诺塔
#include <iostream>#include <cstring>using namespace std;int main() { int d[20], f[20]; d[1] = 1; for (int i = 2; i <= 12; i ++) { d[i] = d[i - 1] * 2 + 1; } memset(f, 0x3f, sizeof f); f[1]原创 2021-02-20 11:22:54 · 71 阅读 · 0 评论 -
ACWing 91. 最短Hamilton路径
动态规划讨价还价。让求从0到n-1的最短哈密顿路径。0到n-1范围太大,如果0到n-2多好,0到n-3多好……如何描述这些子题目:i、j描述的是0到j的哈密顿路径。i表示每个点都被拜访过。所以状态就是i、j注意到如果0到n-1有一条最短路径,那么0到n-2的路径一定也是最短的。所以dp[i][j] = min(dp[i][j], dp[i ^ 1 << j][k] + weight[k][j])#include <iostream>#include <cstri原创 2021-01-12 15:08:31 · 101 阅读 · 0 评论 -
动态规划 leetcode 132
dp[i]:将[0……i]分割成回文子串的最小分割次数对任意状态i,为了达成题目目的,我们第一步应该怎么做?第一步应该分割哪里?我们开始枚举分割位置,假设我枚举到j位置,假设规模小的问题dp[j]已知,那么只需要判断s[j +1……i]是不是回文串即可。如果是,那么dp[i] = dp[j] + 1。如果不是,则跳过。为什么跳过?因为我们是枚举[0, i)所有的j值。对于s[j +1……i],如果不是回文子串,那么需要再次分割至少1次。在哪个位置分割呢?我们后面枚举j值的时候一定能枚举到。所以不用担心,因原创 2021-01-11 17:42:54 · 45 阅读 · 0 评论 -
套用自己的动态规划套路1 leetcode 174地下城游戏
https://leetcode-cn.com/problems/dungeon-game/题目给我们一个矩阵m * n,骑士在右上角,公主在左下角,让我们只能在向右或向下的条件下,寻找最好的、最安全的路径。何为最安全呢?就是这条路径上,骑士的最低健康指数比其他路径都要高。套路的基础是首先你要对问题讨价还价。第一步就是在”讨价还价“第一步,在原问题的基础上缩小问题规模什么叫做在原问题的基础上缩小规模呢?就是你缩小规模的那些问题必须是原问题的子问题。就好比让你求"abcbda"的最大回文子串,“.原创 2021-01-10 16:15:57 · 117 阅读 · 0 评论 -
忽然明白动态规划怎么做了
https://leetcode-cn.com/problems/burst-balloons/戳气球问题。题目让你戳这些[3,1,5,8]气球。可是气球数目太多了,能不能削减一下数量呢?让我戳[3, 1, 5]或者[1, 5, 8]或者[3]也可以……总之气球数目越少越好。上述列举的气球数目较少的情况就是子问题,也可以说是一个个的“状态”(我认为状态就是通过几个变量来表示一个问题)。动态规划其实就是一个状态经过选择之后可由其他状态表示嘛。如何表示这些状态?凭空想很难,但是仔细看题型,有点想序列问.原创 2021-01-05 22:00:35 · 160 阅读 · 0 评论 -
leetcode 354. Russian Doll Envelopes
排序 + 动态规划class Solution {public: static bool cmp(const vector<int>& a, const vector<int>& b) { if (a[0] == b[0]) return a[1] > b[1]; return a[0] < b[0]; } int maxEnvelopes(vector<vector<int&g原创 2020-12-29 15:00:38 · 45 阅读 · 0 评论 -
leetcode 85 最大矩形(动态规划做法)
动态规划很神奇的一个做法。执行速度极快,超越了94%的用户。未完全理解,我先去搞懂84题再回来看 = =。class Solution {public: int maximalRectangle(vector<vector<char>>& matrix) { if (matrix.size() == 0) return 0; int leftMax[matrix[0].size()]; fill(left原创 2020-12-27 15:49:40 · 314 阅读 · 0 评论 -
大号做的动态规划题
https://editor.csdn.net/md/?articleId=109151355https://editor.csdn.net/md/?articleId=108791818https://editor.csdn.net/md/?articleId=108778640https://editor.csdn.net/md/?articleId=108757974https://editor.csdn.net/md/?articleId=108735534https://editor..原创 2020-12-06 21:11:58 · 54 阅读 · 0 评论