Colorful Blocks - abc 167 e

#数え上げ


まず, 超素朴な dp を書いてみる O(N^3)
https://atcoder.jp/contests/abc167/submissions/13093316


遷移をまとめられそう O(N^2)
https://atcoder.jp/contests/abc167/submissions/13094970


dp[i][j] : i 番目のブロックを見ていて, これまでの隣り合う同じ色の ブロックの数の和が j
f:id:tac_12:20200511152418p:plain:w500


もう 1 段くらい書いたら見えてくる


場合の数の経路の問題に似ている


ソースコード
https://atcoder.jp/contests/abc167/submissions/13096583

別解

参考 : 公式 youtube editorial


隣り合うブロックで同じ色の数は決め打ち (探索) する
x とする


f:id:tac_12:20200511153335p:plain:w300
隣り合うブロックが同じ色なら連続部分を囲ってる
3 つ以上連続する場合書いてない...


K = 0 なら,
M * (M - 1) * (M - 1) * ...
= M * (M - 1)^(N - 1)


最初以外はその手前の色以外


今回, 囲った部分単位で見る


囲みの個数は N - x
最初囲みの個数は N で, 隣と同じ色になるごとに 1 減る


よって, M * (M - 1)^(N - x - 1)


あとは, 隣り合うブロックで同じ色の数は決め打ちしたが, どこにするか決めてない


ブロック間 N - 1 箇所から x 箇所選ぶ


https://atcoder.jp/contests/abc167/submissions/13115233