各列を ビットの整数で表す。ビット は白、ビット は青を表す。
まず、同じビットが縦に3つ連続しない列マスクだけを残す。その集合を 、要素数を とする。 より である。各列で選ぶマスクは、あらかじめ塗られたマスの色とも一致する必要がある。
横方向の条件を確認するには直前の2列だけを記憶すればよい。 を、処理済みの列の最後の2列が である有効な塗り方の数とする。新しい列 を追加する際、どの行でも の対応する3ビットがすべて同じでなければ追加できる。このとき に を加える。値はすべて で割った余りとして保持する。
の場合は、最初の列に置けるマスクの数を数える。それ以外の場合は、最初の2列の可能なマスクの組で DP を初期化し、3列目以降の遷移を行い、最後に全状態の値を足す。
縦方向に有効なマスクの生成は 時間、既存の色との整合性確認は 時間、DP は 時間である。遷移を前計算する場合のメモリ使用量は である。加算する値は常に法で割った余りなので、符号付き32ビット整数に収まる。