参考博客:http://godfrey90.iteye.com/blog/725562
一、首先谈谈什么是状态压缩?
状态压缩就是将一个阶段或(集合)的状态使用二进制0、1进行表示,这类问题中,状态只存在两种:有或无。通过二进制来达到节省存储空间和查找效率的作用。
二、什么是动态规划?
动态规划是通过定义某一个状态,这个状态可以通过性质相同的另一个(或多个)状态推导出来,即存在最优子问题。另外,不同问题的子问题中可能存在同样的子问题,这就是重叠子问题。最优子问题、重叠子问题是动态规划的两大特性,如果存在这两种特性,则就可以选择使用动态规划来解题。
如果说状态压缩是数据结构的话,动态规划就是算法。
三、什么类型的题适合用状态压缩动态规划去做?
这类问题一般会设计到棋盘或者网格的题,第i行状态可以通过第i-1行状态递推得到。
例如:n*n的棋盘,放n个车,要求不相互攻击,条件设置比较简单:只有在同行或同列才会攻击。
解:状态为到第i行后各列的放置情况,设第i行的状态为:10011,则第i-1行的状态可以为:00011、10010、10001,所以易知状态转移为:d[i][a]=sum(s[i-1][b])其中a、b之间存在某种联系,本体中是a-b后,只存在一个1。最后d[n][1....1]即为最终结果。