最怕你一生庸碌无为,却总是安慰自己平凡可贵。|

Mr_KaYa

园龄:2年7个月粉丝:2关注:2

2024-3月 DP 总结

换根 DP

  • 换根 DP,又称二次扫描,一般用于求解无根树问题。大多数时候将 n 次 dfs 简化为 2 次从而优化算法。

经典套路:

1. 指定某个节点为根节点(一般为 1)。

2. 第一次搜索完成预处理,同时得到该节点的解。

3. 第二次搜索进行换根 DP,由已知节点推出相邻节点。

具体地,设 fg 两个数组分别表示第一次子树内的答案和以其为根的答案(也可以设子树外的答案)。第一次 dfs 处理 f,第二次 dfs 通过父亲的 g 推出儿子。也即第一次自底向上,第二次自顶向下。这就是所谓“换根”的过程。

例题1 P3478 [POI2008] STA-Station

【题意】

给出一棵树,找出一个点来,使得以这个点为根时所有点的深度之和最大。

【解析】

fi 表示 i 子树内的答案,则显然地,fu=vufv+sizv,这里的 siz 表示子树大小。

第二次 dfs,考虑设 gi 表示以 i 为整棵树的根的答案。则 gv=gu+n2×sizv。特殊地,g1=f1

答案为 maxgi,时空复杂度 O(n)

例题2 CF1156D 0-1-Tree

可以左转我的题解。



斜率优化 DP

  • 斜率优化,一般是在转移方程中当前为 i,枚举决策点 j,然后化简式子出现同时与 ij 有关的项(如果没有可以单调队列)。这样的话有点像一次函数,形如 y=kx+b,那么这里的 kx 就是与ij 有关的项(具体题目具体分析)。问题变成查询最有决策点。

  • 如果式子中的 xy 都有单调性,可以使用单调队列线性维护。否则有两种做法:维护凸壳并二分或李超树(也可以平衡树或 cdq 分治,但我不会,就不弄巧成拙了)。这些做法是带一个 log 的。

经典套路:

1. 写出朴素转移方程。

2. 化简并设出 x,y,k,b,根据所求决定维护上凸还是下凸(最大值还是最小值)。

3. 看单调性决定维护方式。

例题1 P3195 [HNOI2008] 玩具装箱

【题意】

给定一个序列,要求将其划分成若干段,一段划分为 [i,j] 的费用为 (ji+k=ijCkL)2(这里的 Ck 为给定数组,L 为给定常量)。最小化划分序列的费用和。

【解析】

朴素的转移方程为:(设 fi 表示考虑到 i 的答案,si 表示 Ci 的前缀和)

fi=min1j<i(fj+[i(j+1)+sisjL]2)

换元并化简,设 ai=si+ibi=si+i+L+1

fi=min1j<i(fj+[aibj]2)fi=min1j<i(fj+ai2+bj22×ai×bj)

先不管取 min,先推式子,并把只与 j 有关的移到一边,尝试分离 ij

fi=fj+ai2+bj22×ai×bjfj+bj2=fiai2+2×ai×bj

我们发现,如果设 y=fj+bj2k=2×aix=bjb=fiai2,那么方程变成了一个一次函数形式 y=kx+b。所以要做的就是在二维平面中找一个斜率固定的直线使 b 最小。

观察数据,y=fj+bj2x=bj 都单调递增,所以使用单调队列优化,时空复杂度线性。

posted @   Mr_KaYa  阅读(12)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起