【学习记录】有正能量的 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{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
我不知道这个贪心为什么是对的啊呜啊啊谁来救救我呜啊啊

浙公网安备 33010602011771号