状态dp入门

状压dp,很早我就听说过这个算法的名字,感觉这个算法就是可厉害的那种,从昨天起开始了学习状压dp的道路,然后被虐的很惨,真的感觉好难啊,首先我先大致看了看状压的概念,然后便开始看题,看那些经典的题,自己肯定是不会做的,就看别人的代码,可能因为别人都比较厉害的缘故吧,写的代码都不没有太详细的解释,我看起来是真的费力,昨天下午加晚上看懂了一道题,然后今天从早上到现在又看懂了一道题,真的是心累,经过这两天的别虐,也算是大致上知道了什么是状压dp了,就赶紧先记录下来,省的自己给忘了。

状态压缩,简称状压dp,感觉这个和容斥定理挺像的,因为他们都是用一个十进制数的二进制的每个位置的0和1来代表每个物品的状态,

状压dp用的范围都是数据比较小的那种,因为它所表达的都是2^n次方的数组的大小,,所以n的范围大概都是20左右吧,再大就不能用这个算法了,

状压 dp 是动态规划的一种,通过将状态压缩为整数来达到优化转移的目的。

这句话怎么解释呢,假如现在有 3个物品,分别为 x1,x2,x3;然后我们用0和1来表示它的状态,用1表示有这件物品,0表示没有这件物品,那么一共有下面几种情况。

                         

x1    x2    x3   二进制所代表的数字

0      0      0          0

0      0      1          1

0      1      0          2

0      1      1          3

1      0      0          4

1      0      1          5

1      1      0          6

1     1      1           7

意思就是我们可以用一个十进制的数字来代表此时物品的所有状态,例如,5这个十进制数字,所代表的意思就是有第一和第三个物品,没有第二个物品,

因为状压dp都是在二进制位上进行运算的,所有想学好状压dp,位运算的知识是不可或缺的,如果不会可以去补补课,在这里我就不介绍了,就简单的介绍一些比较常见的操作,

1: n(1<<i)

这个式子的意思就是判断n的第i-1位二进制是不是1。

2:x&(x<<i)

这个式子是判断x的二进制位有没有连续的i个1 如果有  return 1,else return 0;

。。。其他的遇到的话再陆续加吧,

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值