薊畑

Thistleのブログ

JOI2018ho-C Dango Maker 裏解法

はじめに

これはクソ解法です。

本番でこんなの書いてたら春合宿に落ちちゃうので、ちゃんとした解き方をしましょう。

考察

まず、図を書いてみると、どれか1つで団子を作れる場合、斜め方向に連結していくことが分かります。

f:id:Thistleprogram:20200614194804p:plain

という感じ。

依存関係を考えるとこの斜めごとに独立に考えられるので、UnionFindで集合にして管理をすることにします。(←ここから狂い始める

さて、こうして斜めごとの集合に分けられたものは、さらに2種類に分けることができます。

f:id:Thistleprogram:20200614195320p:plain

この画像の黄色と、青色のところの2種類です。緑はどちらにも属しています。

上の方から使う向きを決めていった時を考えます。

Gが真ん中にある青の部分は、全部縦にも全部横にもできるので、別で考えることにします。

そうすれば、残りで考える必要があるのは沢山の黄色です。

縦を使えば横が使えなくなり、横を使えば縦が使えなくなるので、縦と横のどっちか多い方を使えばいいと思うかもしれませんが、黄色が大量にあることを考えると、上の方と下の方で使うべき目がばらばらになるかもしれません。

これをDPで解きます。

dp[i][j]=i番目の連結成分を右上から見ていき、最後に使ったRGWがjの向きだった時の最大値

dpの遷移式がわりあい複雑なので注意する必要があります。

実装方針

右上から全部DFSとかしてもできるんでしょうが、辛すぎて死んじゃうので、UFで連結成分ごとに分けて、青を全部識別した後、右上から順に見つかった黄色から全部辿っていき、DPを更新していくのが楽です。(楽ではない)

実装

かなり大変です。

atcoder.jp

最後に

誰も読まないと思っているのでかなり雑です。

もしこれを理解したいという奇特な人がいたなら、

Thistle - AtCoder

からTwitterを特定して、DMをください。