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)\).

posted @ 2026-07-29 20:03  kzssCCC  阅读(7)  评论(0)    收藏  举报