状态压缩(位运算)

位运算优先级:

~

<< >>

&

^

|

常用运算:

置位(set bit)将第bit位置为1

A |= 1<<bit

清位(clear bit)将第bit位置为0

A &= ~(1<<bit)

测位(test bit)判断第bit位是否为1

(A&1<<bit)!=0

(A>>bit&1)!=0

取最后一个非0位

A&-A  原理是:A=0000 0100     -A是将A按位取反然后+1,那么就相当于以最后一个1为分界线,左边全部取反,分界线及其往右是不变的

A&((~A)+1)

统计非0位

for(;A;A-=A&-A) ++cnt;

集合取并

A|B

集合取交

A&B

集合相减

A&~B

时间: 2024-10-01 06:21:38

状态压缩(位运算)的相关文章

HDU - 3006 The Number of set(状态压缩位运算)

http://acm.hdu.edu.cn/showproblem.php?pid=3006 题意 给定n个集合,每个集合都是由大于等于1小于等于m的数字组成,m最大为14.问由给出的集合可以组成多少个不同的集合. 分析 因为m最大为14位,那么可以把一个集合压缩成一个数,每个元素对应二进制的一个位.所有状态最大为(1<<m).用个数组记录出现的状态,用map实测超时. #include<iostream> #include<cmath> #include<cst

状态压缩子集问题

描述:给定一个n(1≤n≤10)个数(可正可负)的集合,求一个划分方法,使得所有划分块的代价和最小.其中每个分块的代价和最小.其中每个块的代价为块内数字的和的平方. 分析:因为看到n最大为10,所以可以用状态压缩DP,复杂度最高为O(2^10*2^10) 设dp[i]表示状态为i的时候的最小代价和. 可以推出dp[X] = min(dp[Y] + dp[Z] | Y∪Z = X && Y∩Z = ∅} 初始的时候dp[X] = sum{a[i] | i在X集合中}^2. 所以可以写出 1

FZU1892接水管游戏-BFS加上简单的状态压缩和位运算处理

原题地址:http://acm.fzu.edu.cn/problem.php?pid=1892 Problem 1892 接水管游戏 Accept: 108    Submit: 498 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 接水管游戏的规则如下: 1.在N*N大小的方格上有两个特别的水管,分别为进水口和出水口: 2.有7种1*1大小的水管需要放在这N*N大小的方格内,使得水流能够从进水口经过这些

二进制状态压缩及位运算

位运算符: 与(&),或(|),非(~), 异或(^); 移位运算: 1.左移:在二进制表示下把数字同时向左移动,低位以0填充,高位越界后舍弃 1 << n = 2^n, n << 1 = 2n 2.算术右移:在二进制补码表示下把数字同时向右移动,高位以符号位填充,低位越界后舍弃 n >> 1 = n/2.0(向下取整) eg:(-3)>> 1 = -2, 3 >> 1 = 1;  二进制状态压缩,是指将一个n位的 bool 数组用 n

ACM学习历程—ZOJ3471 Most Powerful(dp &amp;&amp; 状态压缩 &amp;&amp; 记忆化搜索 &amp;&amp; 位运算)

Description Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These atoms have some properties. When two of these atoms collide, one of them disappears and a lot of power is produced. Researchers know the way

细菌(disease) (位运算)(状态压缩)

细菌(disease) 时间限制: 1 Sec  内存限制: 64 MB提交: 9  解决: 5[提交][状态][讨论版] 题目描述 近期,农场出现了D(1≤D≤15)种细菌.John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格.请你帮助John计算出最多可以选择多少头奶牛. 输入 第1行:三个整数N,D,K. 下面N行:第i行表示一头牛所携带的细菌情况.第一个整数di表示这头牛所携带的细菌种类数,后面di个

状态压缩中常用的位运算(DP)

面对位运算,一直很无感...可能数学太差,脑洞太小. 1.首先是最基本的: 与&,或|,非~,异或^. 2.获取一个或者多个固定位的值: 假设 x = 1010(二进制),我们要取左数第二位的值,可以用(x &(1<<1)); 还可用(x&(3<<2))来取得第三位和第四位. 3.把一个或者多个固定的位上的值清零: 同样 x = 1010(二进制),我们要使左数第二位的值清零,可以用(x^(1<<1)). 待续..

poj 2777 Count Color(线段树、状态压缩、位运算)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38921   Accepted: 11696 Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.

java中通过位运算实现多个状态的判断

通过 <<  |  & ~ 位运算,实现同时拥有多个状态 通过 << 定义数据的状态 public interface LogConstants { /** * 消耗标记 */ short COST_ASSET = 1 << 0; short COST_GOLD = 1 << 1; short COST_BINDGOLD = 1 << 2; short COST_SOPH = 1 << 3; short COST_STRSOU