sos dp
给定维度 \(n\),初始有一些离散的值 \(a_{mask} = v\).
- \(dp_S\) 为 \(S\) 所有子集的 \(a\) 之和,即:
\[dp_S = \sum_{T \subseteq S}{a_T}
\]
for (int i=0;i<n;i++){
for (int u=0;u<1<<n;u++){
if (u>>i&1){
dp[u] += dp[u^(1<<i)];
}
}
}
- \(dp_S\) 为 \(S\) 所有超集的 \(a\) 之和,即:
\[dp_S = \sum_{T\supseteq S}{a_T}
\]
for (int i=0;i<n;i++){
for (int u=0;u<1<<n;u++){
if (u>>i&1^1){
dp[u] += dp[u|(1<<i)];
}
}
}
时间复杂度 \(\mathcal{O}(n\cdot 2^n)\).

浙公网安备 33010602011771号