【动态规划5】状态压缩动态规划

题单介绍

对应进阶篇第 17 章。 在《基础篇》的“暴力枚举”一章中介绍了子集枚举,使用二进制数字来表示一种状态。对于“状态压缩动态规划”中的状态,通常与集合相关联。集合本身具有三个性质:确定性,互异性和无序性 。这也就决定了只关心每个元素的存在状态,而这通常可以使用 0 或者 1 表示存在 或者不存在。例如,一顿饭有 8 道菜,小明同学最终吃了某几道菜,必然是这 8 道菜的子集。令 1 表示吃了, 0 表示没吃,那么以下几个状态:10000001 表示只吃了 1 号菜和 8 号菜; 01010101 表示吃了 2 , 4 , 6 , 8 四道菜。 由此可见,可以通过一串 01 码来清晰地表示一个集合的状态。同时,在确定了最低位的前 提下,一串 0-1 码与一个二进制数一一对应。这种表示状态的方式被称为状态压缩,简称状压。所谓“压缩”,即是用一个二进制数来保存一组状态,将一个集合的状态压缩进了一个二进制数中,而通常这个二进制数在十进制下的大小可以作为其编号。状态压缩本质上是进行了两步操作: 1. 给这个集合的每个状态一个编号; 2. 通过该编号,轻易地访问该状态。 这一章将会从状态压缩谈起,描述一些简单的应用,并最终落脚到状态压缩应用最广泛的动态规划题目。 ![](https://ipic.luogu.com.cn/460dkm.png)

题目列表

  • [SCOI2005] 互不侵犯
  • 关灯问题II
  • A Simple Task
  • [NOIP2017 提高组] 宝藏
  • [BJWC2018] 最长上升子序列
  • [九省联考 2018] 一双木棋 chess
  • 花园
  • [HAOI2008] 硬币购物
  • 邦邦的大合唱站队
  • 砝码称重
  • [USACO06NOV] Corn Fields G
  • [NOI2001] 炮兵阵地
  • [NOIP2016 提高组] 愤怒的小鸟
  • [JSOI2009] 密码
  • [AGC012E] Camel and Oases
  • Rotate Columns (hard version)
  • [PKUSC2018] 最大前缀和
  • 软件补丁问题
  • [SCOI2008] 奖励关
  • [SDOI2009] Bill的挑战