AtCoder Grand Contest 026 D - Histogram Coloring
解法
高さが同じ列のヒストグラムを考えます。
左の列の塗り方が決まっているとき、その塗り方が赤青赤青……のように交互(以下マダラと呼びます)であれば、右の列の塗り方はそれと全く同じにするか真逆にするかの通りの選択肢があり、マダラでなければ真逆にするしかありません。
これを念頭に置いて、次のDPを考えます。
左から列目までを順に決めた時の、列目の下マスがマダラである(下マスはマダラでない)パターン数
先ほど述べたことを使い、次のように場合分けして漸化式が立てられます。
- の場合
- の場合
冪の計算には繰り返し二乗法を使うとして、このままの計算量はとなります。さらに遷移の仕方をよく観察すると、全てのについてパターン数を持つ必要はなく、縦軸に最低限の区切り(具体的には、各の上下)を入れて、区間和をもっておけばいいことがわかります。要は座標圧縮をするわけです。すると計算量はとなり間に合います。
反省
想定解が横で区切っていたのに対して縦で区切ってしまいましたが、そこまで筋悪ではなかったと思うのでよしとしましょう。