集训笔记 Day 1
Cute_Wazzy · · 算法·理论
DAY 1
混乱邪恶的 dp 。
例题 1 :CF1579G
考虑用最少的状态去描述一个状态。
定义
这题好像也可以二分+贪心。
例题 2 :
计数
要求
一个经典的 trick ,
分类讨论,可以选择选
- 选
1 ,不妨令x_1=1 ,则有\sum\limits_{i=2}^nx_i=j-1 ,1\leq x_2\leq x_3\leq \dots \leq x_n 。不难看出方案数等价于dp_{i-1,j-1} 。 - 不选
1 ,不妨令x'_i=x_i-1 ,因为没有1 ,所以1\leq x'_1\leq x'_2\leq \dots \leq x'_n ,x'_1+x'_2+\dots+x'_n=j-n 。不难看出方案数等价于dp_{i,j-n} 。
综上
这个 trick 还是非常有必要的东西。
例题 3 :AT_dp_x
比较有代表性的一类题目。
因为没有顺序,因此考虑安排一个顺序使得最优的安排是这个顺序的子序列。
不难注意到一个性质,若
这个性质的证明可以使用邻相交换法证明。
有这个性质后,排序后随便
还有的类似的题目,扩展到了
例题 4 :LOJ6089 小 Y 的背包计数问题
非常厉害的题目。
最重要的性质是发现物品的质量和数量的特殊性。
考虑根号分治的思想,我们定义编号
我们可以用一种类似于 meet-in-the-middle 的思想。定义
因此有
先处理“大物品”,我们发现“大物品”的数量约束没有意义,因为选完任意一个“大物品”都可以发现,体积会大于
定义
但是完全背包复杂度不行,所以考虑使用例题
同理容易推出了
考虑“小物品”,因为个数少,所以可以直接多重背包+前缀和优化。
习题 5 :P2986
换根 dp 模板题。
考虑以
因此只需要第一次 dfs 时预处理出转移需要的信息,第二次 dfs 时转移即可。
这应该是换根 dp 的常见套路吧(没做过什么换根 dp 的题)。
习题 6 :P1430
状态设计和转移都是平凡的,主要是如何优化。
容易发现每次转移需要前缀最小值,转移时计算即可。
总结:
- 去冗余的状态设计。
- 换根 dp 的常见套路。
- 常见的优化 dp 。