TQX 的 DP AAgain!

闲话:
这确实抽象,将所有人给干离线了……
不如叫做 TQX 的离线 DP QwQ

DP

基本思路就是找一个比较好的能够描绘问题的状态,想怎么转移,再进行优化。

--TQX

背包 DP

loj 6089. 小 Y 的背包计数问题

根号分治优化背包,大概就是利用 cnt×sizcap 将多重变为完全,然后统一转移。

区间 DP

复杂度越高的题越难?(雾

区间 DP 简单的就是 fl,r 这个限制,但是常常来说这是无法解决问题的(除非实在简单

所以需要辅助以与问题相关的信息,例如 max,min, 才能进行转移。

值得注意的是区间 DP 的常数很小,如果枚举了 n 个位置(单调)那么将带有 1n! 的常数!所以 O(n7) 不是梦,50 也能过。

P5336 [THUSC2016] 成绩单 大概说的就是转移代价与 min,max 相关但是与区间内有什么无关,那么就在区间 DP 同时维护最大/最小是什么即可,复杂度 O(n5)

AGC035D Add and Remove 很抽象的区间 DP,大概是说这次我们不顺着来考虑了,从外到内考虑。发现删除中间那个数,会对左右两边各做一次贡献,那么我们可以设 fi,j,x,y 表示 i,j 分别对左右两边做 x,y 次贡献的最小代价。最终答案就是 f1,n,1,1,那么转移也就简单了,中间那个会对左边来 x 次,右边来 y 次,也就是左边区间内的东西对两侧分别 x+y,y,右边则是 x,x+y,那么递归下去搜索即可。

[AGC039E] Pairing Points 区间计数 DP……敢信 O(n7) 能过!大概是说要善于利用 的性质:没有三条边互相相交,那么我们枚举一个点对应的点,那么就可以分成两个区间,这两个区间间形成鱼骨状的联系。

那么需要联通,两边至少需要一个跨过中线的东西吧,这总会有一个最顶顶上的吧,那么分成了 4 块,两两需要联通,状态这不就没了吗?但是发现其实只会有 3 块!

因为一定会存在两个分界点(绿色)使得分成独立的三部分。
那么思路就清晰了,我们只需要知道分界点,那么就可以枚举最上面的那条线,以及下面的两个分界点即可。于是得出式子:fl,r,m=x[l,m),y(m,r]p[x,m),q(m,y]fl,x,pfq,y,rfp+1,m,q1,直接做是 O(n7) 的但是带一个 17! 的常数,能过。
容易利用先枚举绿色断点的方式优化到 O(n5)

树形 DP

或许如果将子树利用 dfn 转化为一个区间,那么树形 DP 可能也可以转化为区间 DP 的模型。只是在这里区间要么相交,要么相离,所以树形 DP 应该是不难于区间 DP 的(雾

经常与线段树合并/长链剖分/动态 DP 等算法结合出现,令人闻风丧胆,不过感觉这些主要考察数据结构。

--TQX

CF1517F Reunion 大概说的是求白点扩展 r 格覆盖所有点的方案数。那么考虑一个朴素的 DP:fx,i,j 表示 x 子树内最深的黑点和最浅的白点的距离。那么转移是简单的。但是复杂度为 O(n5),是无法过的,所以考虑如果白点存在且覆盖了所有黑点,那么只需要记录白点是什么,同理,如果黑点没有被完全覆盖,那么白点没有用,就只需要记录黑点是啥就行了,复杂度被优化为 O(n3)

[AGC034E] Complete Compress 非常神奇,大概就是说基于一个贪心的思路,考虑移动祖孙点是不优的,那么我们只需要移动不同子树内的东西即可。但是也不能把子树内的全部搞定了,因为可能需要分一点出来在祖先的地方平衡其他的子树,这启示我们可以考虑维护一个上下界,表示能达到的状态。考虑到每次移动使得两个点深度 1,启示我们可以利用 dep 作为状态转移,那么设 fi,gi 分别表示上下界,那么细细转移即可。上界是简单的,就是不需要移动,而下界不简单,考虑如果有一个子树太深,那么怎么也无法使得下界为 0/1,那么将 mx=maxgy 求出来,如果 S=min(fy+sizy,mx)<2mx,那么显然就达不到 0/1,反之就可以。至于是 0/1,考虑到每次操作总深度减少的一定是 2,那么这就取决于 fi 的奇偶性。朴素的每个点都要作为一次根,考虑换根即可做到 O(n)

[Ynoi2006] spxmcq 朴素的很简单,fx=wx+max(fy,0),但是需要优化,O(nq) 显然不够。大概说就是考虑将 x 离线升序排序,那么显然的是 max(fy,0) 会在某前段时间为 0,在某后段时间为 fy,那么我们只需要知道 fy 在什么时候变成 >0 的,那么就可以得出 x 的答案即对其联通的子树求和简单即可。不妨设某个根 x,考虑什么时候 fx>0,假设其所在的联通块大小为 siz,原本的权值和为 wei,那么只需要当 w>weisiz 的时候就可以使得 fx>0 了!那么利用 set 存一存,注意新连接一个子树需要更新一下其变化的时间!

CF1326G Spiderweb Trees 咕

数位 DP

一般需要单独处理卡上界的情况,可以将卡上界作为一个状态,也可以直接把上界拆开。通常同时有上下界时会将区间答案转化为前缀和相减。

--TQX

P2657 windy 数 板子题,略。

【UER#4】被粉碎的数字 大概就是简单的在数位 DP 的同时维护一个进位,考虑最后我们需要只是相等,那么再维护一个差值,也就是 fi,x,d 表示考虑到 i 位,前面进过来了 x 位,当前差值为 d,卡个上界记忆化即可。

CF1456E XOR-ranges 非常抽象的一个数位区间 DP。注意到有上下界,这是不好处理的,但是可以发现的是只有 O(k) 种脱离上下界的方法,之后就可以任意填了。考虑最后脱离限制的那位,显然的是之后全放 0 或者全放 1 是最优的,那么考虑枚举区间最后脱离的位,如果 l1,r+1 在之后存在一位不同,那么这一位一定需要做出贡献。于是可以搞出一个区间 DP,设 fc,l,r,0/1,0/1,0/1,0/1 表示区间 l,rc 退位,左右顶着上/下界,下面填的是 0 还是 1,之后枚举断点转移即可。

状压 DP

CF1158F Density of subarrays 更加抽象的状压 DP。注意到当 c 很小的时候,我们就可以简单的状压,做到 O(n22cc)。但是当 c 很大的时候这就显得无能为力,可能需要将 O(2c) 替换为 O(n)。接着就可以发现,利用背包,设 fi,j 表示前 i 个分 j 段的方案数,接下来就是 gl,r 表示转移的系数,表示必须选 l,并且在 l,r 中选了一些使得密度为 1 的方案数,那么直接转移即可。注意加 register 卡卡常。

DP 的优化

通常优化 DP,除了改变状态之外,也可以通过分析转移的性质,进而改变枚举方法或者结合一些其他算法来进行优化。

--TQX

  • 单调队列,非常朴实,咕

  • slope trick,大概就是说利用堆维护 DP 函数的斜率,从而转移。一般来说是将 fi,x 看成一个关于 x 的函数 fi(x),然后维护其形状转移到下一个函数 fi+1(x),一般来说转移加凸函数(如绝对值)的就可以考虑凸优化。

Red Black Tree 注意到 O(n2) DP 是简单的:fx,k=mini=0/1(gx,i+fy,ki),其中 i=1 表示是黑色,gx,i 是修改为颜色 i 的代价。可以归纳得出 fx 是个凸函数,那么合并时暴力加起来,插入 1/1 即可。

[APIO2016] 烟火表演 与上一题类似,加一个可并堆即可。

  • 斜率优化,大概就是说 fx=fy+cx+cy+gxgy 这种东西,其中 cx,cy,gx,gy 都是已知,但是 fy 需要 DP 计算,那么就可以利用斜率优化完成,可以看 # 算法学习笔记(31): 李超线段树

  • 决策单调性,与四边形不等式(交叉小于包含)强相关。对于 2D1D 的问题,如果 w(l,r) 满足四边形不等式以及包含单调性(lxyrw(l,r)w(x,y))那么整个 DP 满足四边形不等式,就可以优化为 O(n2) 了。

但是对于 1D1D 的区间单调性,就需要神秘的方法:单调栈与二分。

大概就是说既然决策单调,那么每一个部分管的区间就是一个区间……那么就可以类似单调栈的搞它。

但是如果仅仅只是 fi=w(j,i) 的东西,那么可以利用分治解决。

Artistic Partition 大概就是说最朴素的 DP 就是 fi,j=fi1,k+w(k+1,j),注意到这里 w(k+1,j) 满足四边形不等式,那么就可以利用分治优化。注意到直接计算不简单,考虑利用莫队(注意分治时用莫队只有常数上的开销!)只是这里莫队转移要带一个 O(d(V)) 的代价,所以单次转移复杂度为 O(nlog2n)。注意到当 k 很大的时候,总可以构造出一个方案使得答案抵着下界 n,不难发现这是 O(logn) 的,于是只需要转移 O(logn) 次即可。其实也可以 O(nn) 的预处理式子(利用整除分块),做到 O(1) 回答,那么总复杂度为 O(nlog2n+nn)

最后

DP,可以说是重中之重,在最优化和计数中常常能见到它的身影。

它没啥套路,又全是套路 QwQ,最可恶的一集。

posted @   jeefy  阅读(50)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示