状态压缩类动态规划
一、问题简介
基于状态压缩的动态规划,又叫集合动态规划,顾名思义,这是一类以集合信息为状态的特殊的动态规划问题,主要有传统集合动态规划和基于连通性状态压缩的动态规划两种。
如果有许多元素的状态都直接影响到决策,都需要被考虑到,为每一个 元素的状态都开一维数组来存储显然是行不通的,于是就需要有一种便于识别和操作的方式记录下各个元素的状态,即对多个元素的状态进行压缩存储,于是基于状态压缩的动态规划应运而生。
二、特点
我们通常把这样一类以一个集合内的元素信息作为状态且状态总数为指数级别的动态规划称为基于状态压缩的动态规划或集合动态规划。基于状态压缩的动态规划问题通常具有以下两个特点。
①数据规模的某一维或几维非常小。
②它需要具有动态规划问题的两个基本性质:最优性原理和无后效性。
三、预备知识
位操作是一种速度非常快的基本运算:有左移、右移、与、或、非等运算。
左移:左移一位,相当于某数乘以2,比如110左移1位变为1100<=>6变为12,表示为(110 << 1) = 1100,因此左移x位相当于该数乘以2^x。
右移:右移一位,相当于某数除以2,比如110右移1为变为11<=>6变为3,表示为(110 >> 1) = 11,因此右移x位相当于该数除以2^x。
与运算:按位进行“与”运算,两数同一位都为1时结果为1,否则为0。例如101 & 100 = 100
或运算:按位进行“或”运算,两位同一位都为0时结果为0,否则为1.例如101|100 = 111
非运算:按位取反。例如~101 = 010.
若当前状态为s,对s有下列操作。
①判断第i位是否为0:(S & (1 << i))== 0,意思是将1左移i位与S进行与运算后,看结果是否为零。
②将第i位设置为1:S| (1 << i),意思是将1左移i位与S进行或运算。
③将第i位设置为0:S & ~(1 << i),意思是将S与第i位为0,其余位为1的数进行与运算;
例如S= 1010101,i = 5
(S & (1 << i)):1010101 &0100000 = 0000000
S| (1 << i): 1010101 | 0100000 = 1110101
S & ~(1 << i) : 1010101 & 1011111 = 1010101