Tenka1 Programmer Beginner Contest 2019 D - Three Colors
解法
まず、三角形の成立条件を思い出すと、長さの三角形が存在するには、
が全て成立している必要があります。
逆に、が最長の辺かつを満たしているとき、三角形を作成することはできません。両辺にを追加した後に2で割ると、
という条件がでてきます。
仮にこの状況になった場合、はの中で最も大きい値になっているはずです。
はで求めることができるので、となるような塗り分け方は、どうにかして求めることができそうな気がします。ということで包除原理を利用して、全ての塗り分け方から、三角形を作成できないようなパターンを引くことで答えを求めることにします。
が最大であると仮定して、そのときにとなる場合の数を求めることにします。すると、これはが最大の場合も全く同じ状況になるので、3倍すればよいはずです。
場合の数を、動的計画法で求めていきます。
- 番目までの数を割り振って、の値がになるようなものの場合の数
とします。これは、
という遷移で数え上げることができます。
右辺の1つ目の項は、をに割り振らない場合で、残ったのどちらかに割り振ることになるので、2倍します。 2つ目の項はをに割り振る場合です。
この遷移を利用して数え上げを行い、あとはとして、
を求めれば、三角形にならないパターンを数え上げることができる…
はずですが、コーナーケースが存在します。
が偶数の場合、となるケースが存在するかもしれません。このパターンは、上のDPをそのまま用いると重複して数えてしまいます。2つのを区別してとすると、
には、
の4つのパターンが含まれているはずですが、最後に全体から引く際に、が最大という条件を外してこれを3倍するため、合計12パターンが引かれることになります。が、というパターンは、通りの並べ方しかないため、2回分引いてしまっていることになります。
これを解消するために、これらのパターンも数え上げてしまいます。これまた動的計画法を利用します。
このパターンは、種類のみにを割り振ると出来上がるので、
- 番目までの数字をとのみに割り振って、となるようなものの場合の数
とすると、遷移は先ほどとほぼ同じで、
という遷移で数え上げることができます。
先ほどの2倍をする部分だけが消えた形になります。
ということで、この遷移を行うとは、の2パターン分だけ綺麗に数え上げられているはずです。
あとは、この部分の調整も行いつつ、
が奇数の場合
が偶数の場合
を求めると、答えになります。
感想
解けるべき問題だった…?気がします。コンテスト中、似たようなDPをすることまでは思いついていたのですが、細かいところを詰められなかったのと、そもそもコーナーケースに気づいていませんでした。
雰囲気でDPを解いているのがバレる回でしたね。