On this page
article
SOS DP
Sobre
O(n 2^n)
soma de sub-conjunto
Link original: sosDP.cpp
Código
vector<ll> sos_dp(vector<ll> f) {
int N = __builtin_ctz(f.size());
assert((1<<N) == f.size());
for (int i = 0; i < N; i++) for (int mask = 0; mask < (1<<N); mask++)
if (mask>>i&1) f[mask] += f[mask^(1<<i)];
return f;
}
// soma de super-conjunto
vector<ll> sos_dp(vector<ll> f) {
int N = __builtin_ctz(f.size());
assert((1<<N) == f.size());
for (int i = 0; i < N; i++) for (int mask = 0; mask < (1<<N); mask++)
if (~mask>>i&1) f[mask] += f[mask^(1<<i)];
return f;
}