不太了解这个东西的具体定义是什么,总之应该是一个用数据结构维护 DP 状态的某几个维度的 trick 吧。

事实上你可以把这篇 post 理解为三个题的解集。

先直接来看 noi2020 - Destiny 这个题。

给定一棵树 T=(V,E)T = (V, E)T=(V,E) 和点对集合 Q⊆V×V\mathcal Q \subseteq V \times VQ⊆V×V ,满足对于所有 (u,v)∈Q(u, v) \in \mathcal Q(u,v)∈Q,都有 u≠vu \neq vu​=v,并且 uuu 是 vvv 在树 TTT 上的祖先。其中 VVV 和 EEE 分别代表树 TTT 的结点集和边集。求有多少个不同的函数 fff : E→{0,1}E \to \{0, 1\}E→{0,1}(将每条边 e∈Ee \in Ee∈E 的 f(e)f(e)f(e) 值置为 000 或 111),满足对于任何 (u,v)∈Q(u, v) \in \mathcal Q(u,v)∈Q,都存在 uuu 到 vvv 路径上的一条边 eee 使得 f(e)=1f(e) = 1f(e)=1。由于答案可能非常大,你只需要输出结果对 998,244,353998,244,353998,244,353(一个素数)取模的结果。

我们略过 DP 的过程,直接给出其定义 f(x,j)f(x,j)f(x,j) 表示考虑子树 iii,限制条件的 v∈subtree(x)v\in{\rm subtree}(x)v∈subtree(x) 且限制 (u,v)(u,v)(u,v) 尚未被满足,uuu 的深度最深且 j=dep(u)j={\rm dep}(u)j=dep(u) 的不同映射 f:Esubtree(x)→{0,1}f:E_{{\rm subtree}(x)}\rightarrow\{0,1\}f:Esubtree(x)​→{0,1} 数量,以及其转移f(x,i)=f(x,i)∑y∈suf(x)(∑j=0dep(x)f(y,j)+∑j=0if(y,j))+f(y,i)∑j=0i−1f(x,j)f(x,i)= f(x,i)\sum\limits_{y\in{\rm suf}(x)}\left(\sum\limits_{j=0}^{{\rm dep}(x)}f(y,j)+\sum\limits_{j=0}^{i}f(y,j)\right)+f(y,i)\sum\limits_{j=0}^{i-1}f(x,j)f(x,i)=f(x,i)y∈suf(x)∑​(j=0∑dep(x)​f(y,j)+j=0∑i​f(y,j))+f(y,i)j=0∑i−1​f(x,j)。

令 g(x)g(x)g(x) 为 f(i)f(i)f(i) 的前缀和,得到平方级算法。

如果我们考虑把 DP 的第二维度状态放到线段树上,那么子树的合并就可以放到线段树上去做,即使用线段树的合并 trick 来做 DP。

我们来看看合并的具体过程。贴近实现,我们令 merge:{(x,y,l,r,sx,sy)}→node{\rm merge}:\{(x,y,l,r,s_x,s_y)\}\rightarrow{\rm node}merge:{(x,y,l,r,sx​,sy​)}→node 表示线段树合并的过程,其中 sxs_xsx​ & sys_ysy​ 表示 DP 的前缀和(即 ggg),在实现(以及下文的讲解)中,均把这两个变量视作别名。

有这样几种情形需要探讨。

  • l=rl=rl=r:此时应该把 f(y,l)f(y,l)f(y,l) 合并到 f(x,l)f(x,l)f(x,l) 中,直接对线段树结点维护的 DP 值进行修改;
  • x=Ωx=\Omegax=Ω:此时 f(x)f(x)f(x) 的 DP 值并没有意义,在本题中可以视作零。于是打乘法标记即可;
  • y=Ωy=\Omegay=Ω:与上一条类似。

于是得到解决,参考实现。

再来看 pkuwc2018 - Minimax 这个题。

给出一棵有 nnn 的结点的二叉有根树,并给出其叶子结点的权值,对于一个非叶子结点,其权值有 pip_ipi​ 概率取得儿子中的最大值, 1−pi1-p_i1−pi​ 的概率取得最小值。

令 {vi}\{v_{i}\}{vi​} 表示最终根结点(111-th 结点)的所有可能取值(升序排列),其个数记为 mmm,每一个 viv_ivi​ 取得的概率记为 rir_iri​,将其按照 hash(i)=i×vi×ri{\rm hash}(i)=i\times v_i\times r_ihash(i)=i×vi​×ri​ 的规则求出 ∑ihash(i)\sum_i{\rm hash}(i)∑i​hash(i)。

与上一题类(完 全)似(一 致)地,同样略过 DP 的过程,给出其定义 f(i,j)f(i,j)f(i,j) 表示结点 iii 取得值 jjj 的概率,以及其转移 f(i,j)=∑v∈suf(i)f(v,j)(pi∑1⩽k<jf(v′,k)+(1−pi)∑j<kf(v′,k))f(i,j)=\sum\limits_{v\in{\rm suf}(i)} f(v,j)\left(p_i\sum\limits_{1\leqslant k<j}f(v',k)+(1-p_i)\sum\limits_{j<k}f(v',k)\right)f(i,j)=v∈suf(i)∑​f(v,j)(pi​1⩽k<j∑​f(v′,k)+(1−pi​)j<k∑​f(v′,k)),其中 v′v'v′ 表示 suf(i)∖{v}{\rm suf}(i)\setminus\{v\}suf(i)∖{v} 中的唯一取值。

令 g(i)g(i)g(i) 为 f(i)f(i)f(i) 的前缀和(显然这里的 ∞\infty∞ 并不是「真正的无限」),得到平方级的算法。

同样考虑把 DP 的第二维度状态放到线段树上,在线段树合并时维护 sxs_xsx​ & sys_ysy​ 表示 DP 的前缀和,直接维护即可。

参考实现。

最后来看到 codeforces - 671D / Roads in Yusland

给定一棵 nnn 个点的以 111 为根的树。有 mmm 条路径 (x,y)(x,y)(x,y),保证 yyy 是 xxx 或 xxx 的祖先,每条路径有一个权值。你要在这些路径中选择若干条路径,使它们能覆盖每条边,同时权值和最小。

这题的平方 DP 都有一定难度……看了 duyi 的题解挺久才理解……不过如果做过 noi2020 - Destiny 的话应该会好很多。

称 route(u,v){\rm route}(u,v)route(u,v) 中的 uuu 为起点,vvv 为终点,在 vvv 决策一个 route 是否被选择。参考 noi2020 - Destiny 的状态设计,令 f(x,i)f(x,i)f(x,i) 表示在 subtree(x){\rm subtree}(x)subtree(x) 中选择了若干 routes,其中终点深度最深并且高于 dep(x){\rm dep}(x)dep(x) 的深度为 iii 的最优方案。

转移即 f(x,i)=min⁡y∈suf(x){f(y,i)+∑z∈suf(x)∖{y}g(z)}f(x,i)=\min\limits_{y\in{\rm suf}(x)}\{f(y,i)+\sum\limits_{z\in{\rm suf}(x)\setminus\{y\}}g(z)\}f(x,i)=y∈suf(x)min​{f(y,i)+z∈suf(x)∖{y}∑​g(z)},其中 g(x)=min⁡1⩽i<dep(x){f(x,i)}g(x)=\min\limits_{1\leqslant i<{\rm dep}(x)}\{f(x,i)\}g(x)=1⩽i<dep(x)min​{f(x,i)},还需要考虑每条 route 带来的额外转移,转移式显然不赘。这些 transforming formulae 也许带有一些构造成分在里面,至少我觉得不太自然……

然后考虑线段树合并优化,你需要支持区间增量 & 全局查询最小值 & 合并(与此同时区间取 min⁡\minmin)& 单点取 min⁡\minmin。因为 O((n+m)log⁡2n)O((n+m)\log_2n)O((n+m)log2​n) 的空间复杂度并不能通过此题。

考虑以时间换空间,我们采用权值平衡树 & 启发式合并来解决(参考实现中给出的是 std::set)。

平衡树上每个结点维护一个 2-tuple (i,f(x,i))(i,f(x,i))(i,f(x,i)),以第一关键字排序。我们依次考虑如何支持上文的操作。

  • 区间增量:如果及时把 i>dep(x)i>{\rm dep}(x)i>dep(x) 的元素弹出,这就变成了全局增量,直接维护即可;
  • 全局查询最小值:这个是本题最妙的地方,因为关键字的选取,平衡树无法简单地取出最小值,我们需要更多的性质。注意到 ∀j<k,s.t.f(x,j)<f(x,k)\forall j<k,s.t.f(x,j)<f(x,k)∀j<k,s.t.f(x,j)<f(x,k),此时的 kkk 都是无用的,可以直接删除,这得出了此题的单调性。如此全局最小值就是平衡树上最右边的结点;
  • 合并:启发式合并即可;
  • 单点取 min⁡\minmin:相当于插入操作,直接来即可,需要注意一些不是特别细的细节(雾)。

如此时间复杂度退成了 O((n+m)log⁡22n)O((n+m)\log_2^2n)O((n+m)log22​n),但是空间复杂度优化到了 O(n+m)O(n+m)O(n+m),可以通过此题。

参考实现。

「tricks」整体DP相关推荐

  1. 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序

    [题目]#6395. 「THUPC2018」城市地铁规划 / City [题意]给定n个点要求构造一棵树,每个点的价值是一个关于点度的k次多项式,系数均为给定的\(a_0,...a_k\),求最大价值 ...

  2. 「SDOI2016」储能表(数位dp)

    「SDOI2016」储能表(数位dp) 神仙数位 \(dp\) 系列 可能我做题做得少 \(QAQ\) \(f[i][0/1][0/1][0/1]\) 表示第 \(i\) 位 \(n\) 是否到达上界 ...

  3. 「CEOI2019」魔法树(DP+差分启发式合并)

    「CEOI2019」魔法树 description solution 设dpi,j:idp_{i,j}:idpi,j​:i子树在jjj时刻的最大果汁量,显然dpi,jdp_{i,j}dpi,j​在jj ...

  4. LOJ#2833 「JOISC 2018 Day 1」帐篷 dp

    题目描述 译自 JOISC 2018 Day1 T3「テント / Tents」 JOI 君经营着一座露营地.露营地被划分为 H 行 W 列的矩阵,各行平行于东西方向,而各列平行于南北方向.从北向南数第 ...

  5. 「火」皇家烈焰 (线性DP)

    「火」皇家烈焰 题目描述 : 帕秋莉掌握了一种火属性魔法 由于钟爱扫雷游戏,帕秋莉把自己图书馆前的走廊看作一个一维的扫雷地图,她制造了很多烈焰,排在这条走廊内 现在帕秋莉告诉你一部分烈焰的分布情况,请 ...

  6. 为教育插上数字化的翅膀,网易云信发布「互联网+教育」整体解决方案

    老师的手轻轻在智能屏幕上一触,空白位置就自动"冒"出了知识点:错过的课程和难点,本地和身处几百公里之外的学生同时能在系统中轻松查阅.互相交流讨论,再次还原和巩固:智能批改和网上批阅 ...

  7. 【LOJ】【树形DP】2485 「CEOI2017」Chase

    LOJ 2485 「CEOI2017」Chase 题目大意 ◇题目传送门◆ 似乎压缩起来有点困难,所以就不压缩了吧 QwQ- 分析 考虑扔一个磁铁能够产生的让逃亡者和追逐者之间的差异. 这个差异就是这 ...

  8. 弘辽科技:抖音电商,一场标准的「字节」式战役

    抖音电商的急速增长,再次向外界展示了一座高速运转的流量机器,如何在明确既定战略后,凭借极强的掌控力迅速攻城略地.这背后既有抖音的中心化能力.巨量引擎的流量商业化能力,也有字节系的2B能力与快速迭代能力 ...

  9. 「收藏」关于机器学习的知识点,全在这篇文章里了

    尊重原创版权: https://www.qingtianxiaoshuo.com/hot/44432.html 更多内容参考: https://www.qingtianxiaoshuo.com/ 「收 ...

最新文章

  1. 2021年大数据环境搭建(二):分布式环境搭建
  2. effectivec++条款18,让接口容易被正确使用,不宜被吴勇
  3. 重载[] int operator[ ]( )
  4. 【Oracle】【日期、时间】 date与数字时间戳互转
  5. Qt消息机制与window程序消息的对比分析
  6. Flume sink=avro rpc connection error
  7. 2021年六月中旬推荐文章
  8. [解决]WebLogic跨域访问安全问题
  9. CCIE安全Lab实战(2005)学习记录
  10. DOM学习之获取元素及事件基础(附实例、源码)
  11. 贪心法 第3关:将真分数用埃及分数之和表示
  12. App进行内测麻烦吗?如何进行App内测?
  13. ROS机器人开机自启动设置
  14. 参加最牛逼的运营人年终聚会,是种什么样的体验
  15. 人工智能阿发狗技术都包含哪些内容
  16. CCF201809-3
  17. 用户体验是什么?如何把用户体验做到极致, 这里有答案
  18. 大疆精灵4与双目视觉智能导航系统
  19. 使用 C# 进行 Outlook 2007 编程
  20. 【Pandas总结】第六节 Pandas 添加列

热门文章

  1. 7s巡检管理系统是什么_基于微信的巡检系统7S巡检管理系统
  2. 哈尔滨联通java_哈尔滨联通套餐资费-哈尔滨联通套餐资费介绍2021【哈尔滨集号吧】...
  3. 表示自己从头开始的句子_形容“从头开始”的诗句有哪些?
  4. 【Docker系列】docker manifest
  5. 知识付费创业目前怎么样?需要做什么?
  6. isPrototypeOf、instanceof、hasOwnProperty函数介绍
  7. 苹果官方iCloud中的照片如何迁移到Google Photo教程来了
  8. 卡尔数科:以数字科技为驱动,始终重视风控体系建设
  9. 进大厂一条龙服务(Java核心面试知识点+一线大厂Java笔试面试题+月薪3万Java优秀简历模板),看这篇就够了
  10. 学习@Transaction异常自动回滚以及手动回滚和回滚部分SQL服务