状态压缩DP板子
作者:
Ysfsblj
,
2022-06-01 20:53:20
,
所有人可见
,
阅读 246
计算所有状态中1的数量
int cnt[1 << n];
cnt[0] = 0;
for (int i = 1; i < 1 << n; ++i) {
cnt[i] = cnt[i>>1] + (i&1);
}
枚举所有子集
for(int state = 0; state < 1 << n; state++){
//情况1:寻找转移后的状态
int cur = 0;
for(int i = 0; i < n; i++){
if(check()) cur |= i;
}
for(int sub = state; sub; sub = (sub - 1) & cur){
if(check()){
f[sub | cur] = min(f[sub | cur], f[sub] + );
}
}
//情况2:把当前的state当作转移后的状态
for(int i = 0; i < n; i++){
if(state & (1 << i)){
f[state] = max(f[state], f[state^(1 << i)] + );
}
}
}