
dp
文章平均质量分 79
dp专题
linlinlin002
学习循序渐进,非一日之功。分层学习,告诫自身;学海无涯,知之甚少,在做的是否有意义;无妨,向前走。我可以!要卷那就卷!
展开
-
树形DP做题回顾(上)
我们可以知道对于u的儿子而言,我们求出了dp[v],那么如何从dp[v]转移到dp[u]中呢,如何转移是最优解呢?一开始以为是网络流的问题,但是仔细一看,这个转移的条件很弱,可以看到求出u的ans,可以推出v的ans转移方程f[v]=f[v]+min(w,f[u]-min(w,f[v]));对于这个问题,很快速的我们可以想到跑两次dfs,第一次预处理出以u为根的子树的第一,二深的深度,第二次dfs进行树形dp,从u->v时推出v的最大深度,用up[v]来存储;代码如下:注意1号节点也需要玩农场,需要特判。原创 2024-09-10 21:28:36 · 691 阅读 · 0 评论 -
虚树+树形dp
虚树实际上是一颗浓缩子树;使用虚树的题目大部分具有查询的点有限,同时虚树构建的信息符合规则;做虚树的题目:步骤为先想出原树的暴力求解做法,然后构建虚树同时向其中添加有用信息(比如边权);虚树的构建过程:虚树的构建大致有两种,但是两种方式都与dfs序有关;首先解释为什么与dfs序有关我们可以知道,虚树的构建是求各个关键点两两的lca的过程。如果是两两求lca,暴力构建虚树的话,复杂度会达到k*k*logn;dfs序的出现可以将复杂度降为klogn;原创 2024-09-10 10:50:35 · 1746 阅读 · 0 评论 -
数位DP与状态压缩DP专题
思路:预处理出横向的合法状态,我这里采用的是处理所有通用的合法状态(即没有考虑地图),最后在dp过程中考虑纵向和地图的影响;你也可以处理出符合地图的所有横向状态,用vector来存储每个横向的合法状态,最后在dp过程中考虑纵向状态即可。直接按照树形结构进行求解,这里需要注意的是0-最高位1的数,比如对于7654321来说,我们需要特别的处理0-999999之间的数。将数存储起来,由大到小进行遍历,状态表示为:选当前的数和不选当前的数;其次进行dp,dp中需要对合法的纵向状态进行筛选,最后进行状态转移;原创 2024-08-27 17:05:34 · 426 阅读 · 0 评论 -
区间dp与树形dp专题学习心得
i,j]这个区间涂抹上p的颜色,这时候注意到[l,i-1]和[j+1,r]的颜色是不变的,根据前面的假设可以知道,这两个区间的颜色都是一样的,于是对于[i,j]区间来说,答案为。信息为:最小删除次数,我们维护[l,r]的最小次数,枚举分割点l原创 2024-08-25 13:37:35 · 486 阅读 · 0 评论 -
线性基专题
也就是对于n个数的数列而言,我们有cnt个线性基,那么这cnt个线性基可以表示数列间的任意乘积,那么我们从n个数中取出构成线性基的cnt个元素(上述证明的对应关系),那么还剩下n-cnt个元素,可以构成。-1,那么这个集合肯定从线性基中取了某个数设为f[i],假设这个线性基在这个集合中只出现奇数次,那么集合的异或值中,i处的异或值必然为1,但是由于线性基中没有了f[i]这个数,于是无法解决这个集合的异或值中i的位置出现1的情况;首先线性基的个数必然和数列中的数有关,对于线性基中某个数,例如f[i]!原创 2024-08-28 15:21:36 · 783 阅读 · 0 评论