动态规划---状态压缩(即集合上的动态规划)

来源:互联网 发布:双线性插值算法 编辑:程序博客网 时间:2024/06/07 10:51


参考博客: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]即为最终结果。

四、推荐题型:

集合上的动态规划---最优配对问题(推荐:*****)

poj 3254---Corn Fields

POJ 2411 Mondriaan's Dream(DP---状态压缩)