状压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;
。。。其他的遇到的话再陆续加吧,