参考:usaxena95’s blog
F
[
m
a
s
k
]
=
∑
i
∈
m
a
s
k
A
[
i
]
F[mask]=\sum_{i\in mask}A[i]
F[mask]=∑i∈maskA[i]
模板:
d
p
[
m
a
s
k
]
[
i
]
dp[mask][i]
dp[mask][i]表示只考虑与
m
a
s
k
mask
mask在低
i
+
1
i+1
i+1位存在不同位数的数字
x
x
x的
A
[
x
]
A[x]
A[x]之和。
也就是说:
x
x
x^
m
a
s
k
<
2
i
+
1
且
x
&
m
a
s
k
=
x
mask\lt 2^{i+1}且x\&mask=x
mask<2i+1且x&mask=x.
//iterative version
for(int mask = 0; mask < (1<<N); ++mask){
dp[mask][-1] = A[mask]; //handle base case separately (leaf states)
for(int i = 0;i < N; ++i){
if(mask & (1<<i))
dp[mask][i] = dp[mask][i-1] + dp[mask^(1<<i)][i-1];
else
dp[mask][i] = dp[mask][i-1];
}
F[mask] = dp[mask][N-1];
}
//memory optimized, super easy to code.
for(int i = 0; i<(1<<N); ++i)
F[i] = A[i];
for(int i = 0;i < N; ++i) for(int mask = 0; mask < (1<<N); ++mask){
if(mask & (1<<i))
F[mask] += F[mask^(1<<i)];
}
某总结
例题:
CF1208F. Bits And Pieces
链接:link
代码:code