自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 动态规划-背包问题-二维费用背包 & 分组背包

那么相应的状态转移方程就会有所不同,我们一般设dp[i] [j]表示当前体积为i ,重量为 j 的情况下所能拿的物品的最大价值。然而,这个行囊有一个特殊的规定:它的最大容量是 V,并且它能承受的最大重量是 M。这天他去商场购物,商场一共有 NN 组物品,第 ii 组里有 sisi​ 件物品,物品的体积为 ww,价值为 vv,对于每一组只能购买一件物品。面对眼前的宝物,小蓝需要做出决定:将哪些宝物放入他的行囊,使得宝物的总体积不超过行囊的容量,总重量不超过行囊能承受的最大重量,且价值总和最大。

2024-02-22 22:50:44 671 1

原创 动态规划-背包问题进阶-完全背包和多重背包

接下来,我们讲讲多重背包,多重背包和01背包区别同样是在物品可选择个数上面,多重背包的某个物品最多可以拿k个,一般在解决这类问题时,我们一般在原有的01背包的模板的第二层for循环之前进行while(k--)操作,就是每个物品更新k次。完全背包问题中,每个物品可以选择无限次,因此对于背包的每个容量,我们需要考虑选择当前物品的各种个数来取得最大价值。这样在较小的输入情况下可以通过,但是不具有普遍性,我们通常采用单调队列的优化来解决多重背包的一般性问题。,它的长度为背包的容量,代表不同容量下的最大价值。

2024-02-21 21:46:03 635

原创 动态规划-背包问题入门-01背包

转移方程为:dp[ i] [j] = max(dp[ i - 1] [ j],dp[i - 1] [j - w] + v );a. 如果当前物品的体积大于背包容量j,则不能放入背包,保持上一行的价值不变:dp[i][j] = dp[i-1][j]。有一个体积为V的背包,商店有n个物品,每个物品有一个价值v和体积w,每个物品只能被拿一次,问能够装下物品的最大价值。最终,dp[N][V]即为所能获得的最大价值,N为物品的总数量,V为背包的容量。我们并不关心某个物品有没有被拿,只关心当前体积下的最大价值。

2024-02-20 22:50:20 662

原创 动态规划-路径相关树形DP and 换根DP

在换根DP中,我们首先任选一棵树中的一个节点作为新的根节点,然后根据原树的边和节点关系,重新组织形成以该节点为根的树。在计算过程中,我们可以利用子节点的计算结果来更新父节点的值,直到最终计算出整棵树的结果。通过换根DP技巧,我们可以在同一棵树上不同的根节点下进行动态规划计算,并获取到所有可能的结果。然后,对于每个节点,我们可以根据其与原根节点的关系,将以新根节点为根的子树的结果转化为以原根节点为根的子树的结果。在路径相关的树形动态规划中,我们需要考虑从根节点到叶子节点的路径,并根据问题的要求计算相关的值。

2024-02-19 21:49:16 2004 1

原创 动态规划-树形DP-自下而上树形DP

在自下而上树形动态规划中,我们从叶子节点开始,先计算叶子节点的值,然后逐步向上计算每个节点的值,直到根节点。自下而上树形动态规划是一种解决树形结构问题的方法,与传统的自顶向下动态规划(top-down DP)相反,它是从叶子节点向根节点逐步计算的过程。自下而上树形动态规划通常适用于树形结构问题,能够高效地求解每个节点的最优解,避免了重复计算,提高了算法的效率。定义子问题:对于每个节点,求以该节点为根节点的子树中,路径和最大的路径。为根节点的子树中,路径和最大的路径的和。值就是整棵树中路径和最大的路径的和。

2024-02-18 21:48:42 907 1

原创 动态规划-树形DP入门-自上而下树形DP

我们今天所讲的是自顶向下的树形DP,自顶向下的树形动态规划是从树的根节点开始递归计算,通过递归地处理子节点的结果来计算父节点的值。树形动态规划通常使用深度优先搜索(DFS)或广度优先搜索(BFS)遍历树的节点,并结合递归或迭代的方式,通过节点之间的关系逐步计算值。树形动态规划的核心思想是通过递归地处理树的节点,利用节点之间的关系来计算每个节点的值,并最终求解整棵树的问题。如计算树中特定属性的值,例如节点之间的最大距离、特定路径的权重等。他们之间的关系就像一棵以董事长为根的树,父节点就是子节点的直接上司。

2024-02-17 22:55:09 1773 1

原创 动态规划-简单了解下什么是期望DP

在期望DP中,我们将问题转化为求解状态的期望值,而不仅仅是状态的具体值。通过定义状态和状态转移方程,我们可以递推计算得到状态的期望值,从而求解问题。在许多问题中,我们不仅关心某个状态的具体值,还关心该状态的期望值,即在多次实验中,该状态的平均值。那么我们可以得到 dp[n][m]=0 ,因为已经达到了目标状态,所以我们可以倒推,我们要求的答案就是 dp[0][0]。令 dp[i][j] 为小蓝已经玩过 i 种职业,j个阵营之后,达到最终状态的期望天数。这里的最终状态是玩遍所有的职业与阵营。

2024-02-16 23:07:59 2773 1

原创 关于数位DP的一些感悟

数位 DP 的优点是可以在较短的时间内计算出特定条件下的符合要求的解答,而不需要枚举所有的情况。但是,在使用数位 DP 时需要注意状态设计、转移方程的正确性和边界条件的处理,以免出现错误的结果。它的核心思想是将问题转化为在每一位上进行决策的子问题,并利用动态规划的方式来避免重复计算。,如果当前状态已经计算过,且没有受限制且不是第一个数字,则直接返回结果。对于一个十进制的数,若任意相邻两个数位的差值的绝对值不超过 K,则称其为小明数。的数字,对于每个数字,根据题目要求进行递归调用。

2024-02-15 22:13:25 693 1

原创 入门普通区间DP和环形区间DP

具体的更新方式为:f[i][j] = max(f[i][j], f[i][k] + f[k + 1][j] + v[i] * v[k + 1] * v[j + 1]),其中 f[i][k] 表示区间 [i,k] 的最优解,f[k + 1][j] 表示区间 [k+1,j] 的最优解。例如f [i] [j]为区间[l,r]的最大价值,则f [i] [j] = max(f[i] [k] + f[k + 1] [r] + cost | l<=k < r)对于每一个区间,枚举所有可能出现的两个子区间的组合。

2024-02-14 21:46:06 670 1

原创 利用二分查找的方式实现求解LIS(最长上升子序列)问题

我们在之前讲过复杂度为O(n^2)的LIS模型,在较大输入规模会超时,所以利用复杂度较小为O(nlogn)的二分查找的LIS模型 来解决LIS普遍性问题。函数返回的是目标值第一次出现的索引,如果目标值在数组中不存在,则返回一个使得目标值可以插入到数组中而不破坏有序性的位置。函数返回的是不小于目标值的第一个元素的迭代器,如果所有元素都小于目标值,则返回容器的。这两种方法之间的区别在于它们在查找目标值时返回的具体位置。函数返回的是一个迭代器,而自定义的。函数返回的是一个索引(位置)。

2024-02-13 23:17:46 707 1

原创 从一道纯板子题了解LCS(最长公共子序列)模型

什么是最长公共子序列,这个概念一般是针对两个输入数组a[]和b[]的,比如,a数组输入元素为1,3,4,7,8,b数组输入元素为1,2,7,8,6,那么这两个数组的最长公共子序列为1,7,8,长度即为3,那么就会有相关题型,怎么去求两个数组的最长公共子序列以及序列长度,这就是这道板子题所体现的内容。,我们求出了长度,怎样去求具体的最长公共子序列?这边有一个图示,能够更清晰地明白其dp[][]数组的运作原理。

2024-02-13 16:39:22 437 1

原创 从一道板子题了解LIS(最长上升子序列)

最后说明一下,本次写的LIS模板是朴素的形式,复杂度为O(n^2),在较小的输入量可以通过,而较大的输入量就要考虑使用二分查找对应的复杂度为O(logn)的形式来求解。每次都是更新dp[i]的值,即为以i对应的数字结尾的最大上升子序列的长度,那么按照本题题意,是不是输出dp][n]即可?,所以还是得求dp[i]的最大值,即为ans = max(ans, dp[i]),初始化ans,并且最后输出ans即可。在理解LIS之前,需要理解什么是子序列,子序列指的是一个序列中,按照。

2024-02-12 22:42:39 513 2

原创 一道线性DP题目进阶-论二维DP

所谓二维DP,即为dp数组的维度为二维的dp(当然有时候可能会三维四维,或者存在一些优化使得它降维),广义的来讲就是有多个维度的dp,即用于描述dp的状态不止一个。个可用步数(即还能向下移动的次数)时,可以获得的最大得分,二维数组a[N][N]还是不变,为输入直角三角形的具体数字。在之前,我们做过一道线性DP的题目,即为数字三角形,现在在这道题目的基础之上添加。个步数可用时的最大得分以及从第一行第一列开始,还有。,这使得dp数组从二维升到了三维,考虑的因素更多了。,表示从第一行第一列开始,还有。

2024-02-11 22:27:16 705 1

原创 动态规划(DP)入门——线性DP

题目通俗易懂,对于最大和,那么有些人会想利用贪心,每次取路径中最大的点,那么最后的和是否最大呢,显然不行,会遇到先小后大的情况,所以贪心在本题并不适用,我们只需要每次得到路径的最大和,这个就是一个状态,然后不断遍历一个‘直角三角形,实时更新最大状态,最后特殊的一个状态为答案,根据此题,我们定义一个dp[N][N],表示从(i,j)点往下路径的最大和,原二维数组为a[N][N]。不断更新dp[i][j],输出dp[1][1]即可,即为第一行第一列往下最大的,即为从端节点开始,即为题目所求。

2024-02-10 23:23:21 929 1

原创 字典树的一个实际应用

字典树是字符串查找里边比较重要的一个算法,相较于朴素的字符串查找来说,后者为循环遍历,对于每一次询问的时间复杂度为O(n),这样查询次数一多就会超时,对于字典树而言,查找次数的多少并不会影响其时间复杂度O(m),m为字符串长度,这样对于多次字符串查找,字典树往往使用得较多。如图所示,字典树初始化根节点,该节点不会存放任何字符,可设置为空,权值为0,之后根据输入的字符存放若干节点,相同合并,不同并行,每个节点除了存放字符外,还存放从根节点到既定节点的字符串出现次数,如图可知"apple"出现了5次。

2024-02-09 22:34:48 526 1

原创 初学Manacher算法必会的一道板子题

在循环中,首先判断当前遍历的位置是否已经在已知回文半径范围内。如果是,则更新当前位置的回文半径,可以直接利用对称性得到。如果当前位置不在已知回文半径范围内,那么需要从头开始匹配回文半径。同时,更新当前位置的回文半径。如果当前位置加上回文半径超过了已知回文半径范围,则需要更新已知回文半径范围。Manacher算法是计算字符串中每个位置作为回文中心的回文半径的算法,那么就可以衍生出一道题,如何计算出一个字符串的最长回文子串,说的就是这个板子题。数组,找到最大的回文半径(减去1后即为最长回文子串的长度)。

2024-02-09 20:49:05 641 1

原创 字符串Hash的一个板子题的思考

今天学到了字符串Hash,我觉得相对于kmp算法来说,字符串hash通过子串的hash值之间进行比较,字符串哈希适用于频繁比较和查找字符串的场景,例如判定两个字符串是否相等、判断字符串是否存在等。KMP算法适用于需要在一个字符串中寻找另一个字符串的出现位置的场景,例如查找关键字、实现字符串匹配等,对于复杂度来说,字符串hash的字符串比较通常在于O(1),但是有hash冲突,所以并不稳定,kmp算法虽然有O(n + m)(ps:n,m分别为源,模式字符串的长度),但是较为稳定。字符串hash的整体框架。

2024-02-08 23:24:13 558

原创 一个kmp算法板子题的思考

今天学到的是kmp算法,之前学过一次了,但是使用的不是很熟练,容易卡在next数组的灵活运用,而这个数组是算法的精髓,在于减少匹配次数从而得到降低算法时间复杂度的效果。,用于记录模式串在目标串中出现的次数。遍历目标串的每个字符,依次和模式串进行比较。,用于指示已匹配的模式串的最后一个字符位置。本题是该算法的一个简单运用,即为模式串在文本串中出现的次数,通过计算。的位置,继续向前匹配,最后,遍历完整个目标串后,输出最终的结果。数组,找到模式串的最长前缀和后缀的公共长度。,即模式串在目标串中出现的次数。

2024-02-07 22:20:34 514 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除