7.25笔记

  • 从小到大枚举排列:从 \(1 - n\) 插入每个数,第 \(i\) 个数有 \(i\) 种插法,所以可以枚举出 \(n!\) 种排列。
  • 可行性 \(dp\),其中的表示以这个下标构成的方案是否可行。
  • 背包 \(dp\) 中放物品的顺序是可以打乱的,所以当你需要撤销一个物品时,可以把它看做是此时最后一个加入的物品,然后直接撤销即可。
  • 状压 \(dp\) 本质:对爆搜的一种特殊的记忆化搜索优化,用 \(2^i\) 是否为一来表示第 \(i\) 个有没有被选,而每一次枚举的是最后一个进入状态的数。
  • 子集枚举: (\(s\)\(m\) 的所有子集)
    for (int i = 1; i <= (1 << m); ++i) {
        for (int s = i; ; s = (s - 1) & i) {
            .....
        }
    }
    
    复杂度:\(O(3^m)\)
  • 当需要求一个集合的值时,可以把这个集合 \(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})\)
posted @ 2025-07-25 16:01  Optimist_Skm  阅读(6)  评论(0)    收藏  举报