【学习记录】有正能量的 DP

组合

「KDOI-12」能做到的也只不过是静等缘分耗尽的那一天。

首先要刻画出原问题的充要条件。默认 \(x<y\),根据笛卡尔树的构造方式,有:

  • \(p_x<p_y\)
  • \(\max_{i=x+1}^{y-1}p_i<p_y\)
  • \(\max_{i=1}^{x-1}p_i<p_x\) 或:
    • \(p_z\)\(x\) 左侧第一个满足 \(p_z>p_x\) 的,则要求 \(\max_{i=x+1}^{x-1}p_i<p_x\)\(p_z>p_y\)

转化成:

  • \(p_z=\max_{i=z}^y p_i\)
  • \(p_x=\max_{i=z+1}^x p_i\)
  • \(p_y=\max_{i=z+1}^y p_i\)

可以分别钦定 \(p_x\)\(p_y\)\(z\) 的值,组合数计数并大力推导。

记录一个巧妙解法:考虑从大到小往序列中填入权值,则三个 \(\max\) 的条件实际上是一些填入的先后顺序限制关系。容易发现该限制关系是树形的,所以可以用树的拓扑序计数。

答案如下:

\[\frac{n!}{xy}+(\sum_{i=1}^{x-1}\frac{n!}{(y-i+1)(y-i)(x-i)}) \]

里面的部分用裂项处理,最后只需要预处理出 \(\frac{1}{i}\) 的前缀和就可以 \(O(1)\) 查询了。

这里也可以用概率理解。

考虑区间 \([i,y]\) 上的随机排列,位置 \(i\)\([i,y]\) 上最大值的概率为 \(\frac{1}{y-i+1}\),剩余 \(y−i\) 个位置中,位置 \(y\) 为最大值的概率为 \(\frac{1}{y-i}\),在区间 \([i+1,x]\) 中,位置 \(x\) 为最大值的概率为 \(\frac{1}{x-i}\),总排列数为 \(\frac{n!}{(y-i+1)(y-i)(x-i)}\)

关键点:

  • 首先需要第一步的刻画,多手玩样例,类似笛卡尔树这样的常见结构的性质可能多做题就有感觉了。
  • 看到一些比较简单/单一的限制关系,可以尝试拓扑序有关。
  • 裂项等数学常用推导技巧。\(\frac{1}{xy}=\frac{1}{y-x}(\frac{1}{x}-\frac{1}{y})\)

能做到的也只不过是静等缘分耗尽的那一天。

「KDOI-03」构造数组

我忘了 hyy 讲的没前途的做法是什么了。

做法见题解

关键点:

  • 了解到 hyy 大佬提到的没有前途的做法是“先不考虑顺序,然后发现阶乘不好算”。所以不要考虑“先不考虑顺序”。(这是什么意思?)
  • 观察解法,发现第一眼容易将复杂度误认为是 \(O(nV^2)\)。但实际上其中的两层循环可以合并成 \(\sum b_i\),复杂度实际是 \(O(V^2)\) 的。
    分析复杂度时需谨慎,不要把正解当错解。CSP-S2025 T4 好像也有类似的复杂度分析来着。

[RMI 2018] W

最搞笑。

可以学习 wxir,按值域从小到大转移,根据 \(\text{W}\) 的形状设置 9 种(据说)状态,然后一一转移。

也可以学习题解,按值域从大到小转移,根据 五个拐点分别是否确定 设置 \(2^5\) 个(实际上有效的只有 12 种)状态,并分讨仅仅 41 个转移即可。

其实这是隔板法练习题。敢写错一个就调一年。

「OICon-02」Subtree Value

详细做法见题解

关键点:

  • 注意到模数的特殊性质。由于 \(U^V\)\(V\) 很小,结合题目条件中的式子是一个内部乘法,外部加和的形式,所以可以把原式从 \(|S|+a_i\) 转为 \(Ux+(y+a_i)\),并用乘法分配律优化树形背包 DP。

大哥计数

大哥计数的总结写起来也太累了。而且我还没做重塑时光和岁月。怎么办,先拖一拖吗?啊啊时间好少啊。。我太颓废了。准备跳了吧。3,2,1,足

主旋律

这也太困难了。

https://www.cnblogs.com/Go7338395/p/14907440.html

https://www.cnblogs.com/Linge-Zzzz/p/18819098

重塑时光

这更困难了。

岁月

完全不会。


状压

绝顶之战

好题啊。

容易发现,填入一个物品后,一段空区间就被划分成了两个互不影响的子区间,构成两个子问题。

这个很适合 DP。但没有限制的情况下不好 DP,于是先枚举 \(T\) 表示 \(T\) 中的物品一定不选。

我们是可以判断某长度的区间能否放下状态 \(S\) 里的物品的。但是这么设状态很浪费。所以我们把长度放进 DP 值里。

\(f_S\) 表示 \(S\) 里的物品最长可以放到的长度,得到一个区间 \([\sum_{i\in S}a_i,f_S]\)

先把 \(S\) 中编号最小的 \(x\) 拿出来,枚举放在该物品左边的物品集合,即 \(S/x\) 的一个子集,转移 \(f_S=\max\{f_{S1}+f_{S2}+a_x-eps\}\)

注意到对于 \(f_S\) 还有一个限制,即 \(T\) 中所有编号小于 \(x\) 的长度都必须大于 \(f_S\),否则这个区间就会被放入 \(T\) 中的一个物品。二者取最小值即可。

实现直接用记忆化搜索即可。令 \(X\)\(T\) 的补集,check 的条件显然是 \(f_X\ge m\),若不满足此条件,一些属于 \(T\) 集合的元素可能会被放入,就不合法了。

一个细节:转移里面的 \(eps\) 太讨厌了。直接去掉 \(eps\),并把 check 条件改成 \(f_X>m\) 即可。

感觉这道题的总结写得太意识流了。关键点(不会组织语言所以抄袭了 jr_zch 大佬的):

  • DP 的值域为 0/1 或者较小的时候可以考虑交换 DP 的状态和值域
  • DP 转移中的贡献或者限制有后效性,但是贡献和限制只和最后的整体形态有关,那么就可以提前对整体形态的某个量进行枚举,算答案时仅计算符合枚举条件的部分即可。

树形

[POI 2021/2022 R2] age

我们组是不是每个专题都会有一道搞笑题?

原树可以分成若干个联通块,每个块里有且仅有一个关键点,由它遍历块内所有点,并在某个点结束遍历。

它需要的天数即为 块内边数的两倍 减去 块内距离关键点最远的点 与它的距离。

所以直接 DP,算以每个关键点为起点,互不相交的若干条路径的和的最大值。

状态:

  • \(dp_{u,0}\) 表示点 \(u\) 子树内已决策完毕,没有点作为新路径的一部分;
  • \(dp_{u,1}\) 表示点 \(u\) 子树内有一个普通点作为一条未确定路径的端点;
  • \(dp_{u,2}\) 表示点 \(u\) 子树内有一个关键点作为一条未确定路径的端点。

直接转移就行了。

关键点:

  • 把问题转化成求一个新东西的最值。因为原问题不好求。这算什么套路吗,这不是每道题的基操吗。叽里咕噜说啥呢。

『SpOI - R1』架子鼓可以站 C

首先答案大于等于原树的直径,且每次修改不会改变 不经过点 1 的路径 的长度。所以若新的直径长度大于原长,新直径一定经过 1。

观察一会就可以发现,在树中任选两条不相交且不经过点 1 的路径,可以实现把它们都接到 1 下面,构成一个新的最长直径。构造很简单,答案是最优的是咋证来着我不会啊。看题解吧。

所以求,两条不相交不经过点 1 的路径的长度和的最大值。发现这个问题跟上一道题没啥大区别,类似的方法直接 DP 即可。

看来题单里的搞笑题并不只有我们组的题。

关键点:

  • 注意到一些特殊性质。观察题目操作的特点。感觉还是说了跟没说一样。

[USACO23DEC] Cowntact Tracing P

我不知道这个贪心为什么是对的啊呜啊啊谁来救救我呜啊啊

posted @ 2025-12-13 08:35  PhainonK  阅读(46)  评论(7)    收藏  举报