典型的アルゴリズムについて(2)
前置き
プロコンの典型アルゴリズムに関する記事(第2回)を書く。
取り上げるもの
変数について全探索をすること。(bit全探索とかいうのでしょうか?)計算量は当然変数の数に対して指数オーダなので、大規模な問には使えない。
例えば下記が例題となる。
No.43 野球の試合 - yukicoder
総当たりリーグ戦が途中まで終わっている状況で、残りの試合が終わったとき、指定のチームが最高何位になれるかを求める。これはまだ試合していない所について、勝敗の組み合わせを全通り試せばOK。
サンプル
for (int i = 0;i < (1 << M);i++){ for (int j = M-1; j>=0 ;j--){ if(i >> j & 1){ } } }
M個の変数についてこれで探索できる。初めてみた時はちょっと面食らった。
は、長さのbit列に対応する。例えばとしたとき、は0から3となり、bit表記するとそれぞれとなる。これはすなわち2変数のとりうる組み合わせを列挙している。
は、左から順にbitが1であるかを判断している。
例題の場合
#252912 No.43 野球の試合 - yukicoder
先の例題はこんな風にとける。順位を計算する所の書き方がしっくりきていないが、リーグ戦で未試合の部分を見つけて、勝敗について全探索する。