bit全探索
bit全探索とは、N個のものから、いくつか選ぶ方法を全列挙して調べ上げる方法
参考
bit 全探索 - けんちょんの競プロ精進記録 https://drken1215.hatenablog.com/entry/2019/12/14/171657
習得の流れ
座学:bit 全探索 - けんちょんの競プロ精進記録 https://drken1215.hatenablog.com/entry/2019/12/14/171657
演習:AOJ ALDS1_5_A 総当たり https://onlinejudge.u-aizu.ac.jp/problems/ALDS1_5_A
まずは深さ優先探索(DFS:depth first search)で実装、OKならbit全探索で実装
座学:各ループ及び変数が何を表現しているか自分の言葉で表現する。
演習:
茶diff
AtCoder ABC 173 C - H and V https://atcoder.jp/contests/abc173/tasks/abc173_c
緑diff
AtCoder ABC 128 C - Switches https://atcoder.jp/contests/abc128/tasks/abc128_c
AtCoder ABC 147 C - HonestOrUnkind2 https://atcoder.jp/contests/abc147/tasks/abc147_c
bit全探索最初の一歩 O(2^N)
C++ for(int bit=0; bit < (1<<N); ++bit ){
python for bit in range(1<<N):
Rust for bit in 0..1<<N{
整数値から、「いくつか選ぶ方法」への復元
if (bit & (1<<i)) {
if ((bit>>i) & 1) {
理解
(2^N)全探索って呼ぶと私は理解しやすい。
1次ループ(変数bit)に対して、2次ループ(変数i)で各桁のbitが立っているか
立っているなら任意の処理(今回は要素を足す)する。1次ループが2^n回すからめっちゃまわる。