状态压缩dp

关于状态压缩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土地上种植牧草的方案数
我写的题解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值