状态压缩dp

来源:互联网 发布:软件我的手机 编辑:程序博客网 时间:2024/06/09 15:21

关于状态压缩dp的一点理解

练几道题就明白

前导算法
最少掌握二维的dp
进制转换
数论基础

算法干嘛
可以求解方案数啊,减少维数,本质还是dp求解

算法思路
若果一道dp题,发现确定状态的参数很多,并且他们在某种意义下,是相近的。
这时,可以将其编号,然后用进制的方式压缩到成一个参数,进而减少dp的维数。比如原先空间是dp[100][2][2][2][2][2] 可以变成dp[100][1<<5];
当然转移方程也需要调整,有时会比较麻烦。可以 模块化,打包成一个函数。然后调用。

算法阶段
发现维数众多,状态众多
合并维数用一位表示多维
设计对应的转移方程
遍历状态,求解值

个人感觉
状态压缩是一种dp姿势。其实是在利用数论知识用数描述状态,但是由于基础数据类型int有32位,一个int变量最多表示32个独立参数表示的状态。

模板

for(int i=2;i<=m;i++){ //枚举行数     for(int k=0;k < (1<<n);k++ ){//枚举这一行的状态         if(isOk(i,k)){      //查询这个状态是否合理              dp[i][k]=sum(i,k);  //状态转移方程         }    }}

这些题大家可以练习(遇到补充)

1.POJ - 3254 Corn Fields
求在m*n土地上种植牧草的方案数
我写的题解