水銀メモ_________φ

外部記憶装置として再開

TopCoder SRM689_Div2 : ColorfulGardenHard

TopCoder Statistics - Problem Statement

問題

花の種類を表す文字列ある位置における配置禁止の色 の二つの情報が与えられる。
花は色を持ちアルファベットで表現される。

与えられた花を以下の条件に従い並び替えた時、 そのパターンの総数を求めよ。 (重複は除く)
同じ色の花が隣合わない
位置iで禁止されている色を置いてはいけない

解放

文字列の長さが高々15のため、bitDPを利用できる。(制約からすぐに気付きたい)
重複を避けるために各bitマスクの状態で、次に追加する特定の色が2回以上選択されないように注意する。

計算量は  O(2^n n^2) となる。
bitマスクの状態数  2^n 通り
最後に選択した色  n 通り
各状態に対して、最大 n 通りの次に選ぶ花の選択技

コード

gist.github.com