【算法】状压DP-2

状压DP

    • 介绍
      • 介绍
      • 例题
    • 总结

介绍

介绍

状态压缩就是使用某种方法,简明扼要地以最小代价来表示某种状态,通常是用一串01数字(二进制数)来表示各个点的状态。这就要求使用状态压缩的对象的点的状态必须只有两种,0 或 1;当然如果有三种状态用三进制来表示也未尝不可。
状态压缩DP:顾名思义,就是用状态压缩实现DP。
不过呢,对于装压DP来说,不一定是二进制。

状压DP主要分为集合式和棋盘式,本文只讨论棋盘式。
集合式点这里。

例题

点这里。

总结

对于棋盘式的状压DP,有几种思考方式。

  1. 每行每行考虑,逆推DP。
  2. 每列每列考虑,逆推DP。
  3. 每个格子每个格子考虑,顺推DP。
  4. 每个格子每个格子考虑,dfs顺推。
  5. 同时考虑两行,三维DP,适用于类似炮兵阵地的题目。
  6. 考虑三进制状态压缩,如炮兵阵地的解法 2 2 2
  7. 对于三维DP,有可能炸空间,可以考虑滚动掉一维。

记住

  1. 再三检查空间复杂度。
  2. 检查时间复杂度。
  3. 检查输入时的下标和枚举时的下标是否匹配。
  4. 检查各种位运算的优先级是否有冲突,该加的括号一定要加。
  5. 检查状态的定义和输出。
  6. 检查for的枚举顺序。

你可能感兴趣的:(C++算法,算法,c++,动态规划)