7.25笔记
- 从小到大枚举排列:从 \(1 - n\) 插入每个数,第 \(i\) 个数有 \(i\) 种插法,所以可以枚举出 \(n!\) 种排列。
- 可行性 \(dp\),其中的表示以这个下标构成的方案是否可行。
- 背包 \(dp\) 中放物品的顺序是可以打乱的,所以当你需要撤销一个物品时,可以把它看做是此时最后一个加入的物品,然后直接撤销即可。
- 状压 \(dp\) 本质:对爆搜的一种特殊的记忆化搜索优化,用 \(2^i\) 是否为一来表示第 \(i\) 个有没有被选,而每一次枚举的是最后一个进入状态的数。
- 子集枚举: (\(s\) 是 \(m\) 的所有子集)
复杂度:\(O(3^m)\)。for (int i = 1; i <= (1 << m); ++i) { for (int s = i; ; s = (s - 1) & i) { ..... } } - 当需要求一个集合的值时,可以把这个集合 \(s\) 拆成 \(s - lowbit(s)\) 与 \(lowbit(s)\),而这两个集合都是之前处理过的,所以正确。
- 树形 \(dp\) 常用套路:用 \(dp_{i,\ 0/1}\) 表示以 \(i\) 为根的子树内/外的信息,然后考虑如何合并即可(注意考虑父亲与儿子那条边走过的次数)。
- 树形背包:对儿子进行合并背包,父亲的背包必须倒序枚举,而儿子的背包枚举可顺序可倒序,复杂度为 \(O(n^2)\)。
- 线性背包常用套路:\(dp_{i,\ j}\) 表示前 \(i\) 个数中用了 \(j\) 次操作,然后转移时枚举 \(k < i\),求得 \(min(dp_{k, j - 1} + cost_{k + 1 \to i})\)。

浙公网安备 33010602011771号