状压DP

来源:互联网 发布:em getsel vb 编辑:程序博客网 时间:2024/05/21 21:46

状压DP

知识要点

一般数据很小,暴力又过不了

常用方法

然而并没有

补充一点:1:判断一个数字x二进制下第i位是不是等于1。

方法:if(((1<<(i-1))&x)>0)

2:将一个数字x二进制下第i位更改成1。

方法:x = x| ( 1<<(i-1) )

3:把一个数字二进制下最靠右的第一个1去掉。

方法:x=x&(x-1)

例题

1. 旅行商问题

dp[S][i] 表示经过点的集合为S,当前到达i号结点的最小花费。

S中访问过的为1,未访问为0

dp[S][i] = min{dp[S^(1<<i)][k] + w(k, i)} (k:S&(1<<k) != 0

2. CodeForces 453B

dp[i][j]表示前i个数达到j状态的最小的结果,j状态表示已经被用过的质数。因为a小于等于30,所以如果某个数超过60,那么选择1一定比它更优,所以我们能够用到的数的质因子也一定不会超过60,也才17个,所以我们只需要每次枚举数,然后通过之前的状态进行转移即可。

3. CDOJ 1296

Dp1[i]表示 这些点连在一起的时候,最少需要多少边。(其实是判断性问题)

dp2[i]表示 这些点连在一起的时候,可以有其他的点也并入,最少需要多少边。

dp3[i]表示 这些集合对应的点连在一起的时候,最少需要多少边

    (通过k个城市对,可以分成一些联通的集合 )

dp4[i]表示 这些集合可以相互不连通的时候,最少需要多少边

dp1 à dp2à dp3à dp4

枚举子集

原创粉丝点击