
dp
文章平均质量分 95
动态规划
as_sun
这个作者很懒,什么都没留下…
展开
-
单调队列优化DP模型整理
这里问的是至少连续多少个,那么显然答案有很多,而且合法答案是满足单调性的,我们抽象的来看一下,很显然如果空的题多了,那么花费肯定不会超过t,如果空的题少了那么花费肯定又大于t,这里可能会疑惑是否严格满足单调性,但是我们只找最小的方案,那么就是小于这个方案的花费肯定大于t,大于这个方案的花费小于t,那么就可以再往下一点去找。显然这个嵌套循环的时间复杂度有点高,很容易超时,那么我们观察一下,往前延伸j个,要求最大值,那么不就是在前面长度为j的窗口中求最大值嘛,用单调队列优化一下即可。,然后要求最大效益。原创 2024-01-29 16:50:09 · 687 阅读 · 0 评论 -
状态压缩dp模型整理
状态压缩dp的核心在于将每一层视为一个状态,这些状态用二进制来表示,每一层由上一层转移而来,那么这么来看的话,我们只用预处理本层的每一个状态可以由上一层的哪些状态转移而来,然后由此来更新本层每个状态即可。这种一般由于状态不能选满,所以看似时间复杂度很高,但实际循环跑不满。原创 2024-01-22 20:04:39 · 1043 阅读 · 0 评论 -
数字三角形模型
数字三角形是动态规划中的一种模型,主要用于从一个图的左上角,每次移动只有两个方向,移动到右下角,移动过程中路径上的一些特性,或者再抽象一点,每一步只有两种被更新的方式(对应下移和右移两个操作),求完成操作过程中的一些特性。原创 2024-01-16 23:27:36 · 1620 阅读 · 0 评论 -
树形dp模型整理
如图,如果我们要求3距离其他点的最远距离,那么它可以来自它的子节点(5,6,7),也可以来自它的父节点2,如果来自父节点的话,也有两个取向,要么是来自父节点的父节点(1),要么是来自兄弟节点。状态计算:这样定义的话,那么显然我们就不用考虑从父节点转移而来的问题,因为我们定义的是以u为根的情况,那么只需要考虑从子节点转移的情况,而且最后的结果被累计在root节点上,城市构成一棵树,那么就只有一个根节点。对于每个点来说,它实际有三种状态,要么被它的父节点看到,要么被它的子节点看到,要么就是它自己放哨兵。原创 2024-01-25 14:58:18 · 957 阅读 · 0 评论 -
最长上升子序列模型(LIS)
最长上升子序列模型就像它的名字一样,用来从区间中找出最长上升的子序列。它主要用来处理区间中的挑选问题,可以处理上升序列也可以处理下降序列,原序列本身的顺序并不重要。原创 2024-01-18 16:25:43 · 2803 阅读 · 0 评论 -
区间dp模型整理
我们据此来看[2,10]实际划分成了[2,5],[5,10],能量是2*5*10,[2,5]划分成了[2,3],[3,5],花费是2*3*5,那么推广开来:dp[l][r]=dp[l][k]+dp[k][r]+l*k*r.那么这里我们换一种方法来进行循环,我们第一维循环区间长度,第二维循环左端点位置,由此可以算出右端点位置,然后第三维循环划分位置k,这样的话,我们划分用到的一定是更短的区间,更短的区间我们之前算过,就不会出问题。要求每一块儿的平方,首先得求出每一块儿的值,这里可以用二维前缀和来实现。原创 2024-01-24 18:21:51 · 918 阅读 · 0 评论 -
背包问题模型整理
背包问题可以视为组合dp,而最长上升子序列问题视为线性dp(区间dp),它们的区别在于当前位置的决策跟前面具体某个的值有没有关系,或者说,当前位置的选与不选与已经确定的序列的最后一个位置有没有关系,如果有关系,那么就是线性dp,需要以i作为结尾,如果没关系就是组合dp,前i个笼统考虑即可。原创 2024-01-20 22:10:53 · 2531 阅读 · 0 评论 -
斜率优化dp模型整理
我们可以通过山的间距算出每座山到1的距离,又因为速度是1m/s,那么距离和时间相当于1:1的关系,设出发时间为s,那么到达第i座山的时间就是s+di,这座山上的某只猫的玩耍时间为ti的话,那么ti + wi=s+di,所以对每只猫来说,如果不用等待,那么显然s=ti-di,这即饲养员的最早出发时间,它的自身属性相当于就是ai=ti-di,另外注意到,饲养员的出发时间可以为负值,所以di>ti也无所谓。如图中的绿线,它经过的点,显然是从下边界中找到两个斜率,一个大于它,一个小于它,由此确定出它经过哪个点。原创 2024-01-29 22:48:34 · 1018 阅读 · 0 评论