F - Tournament Editorial by ansain


公式解説と少し異なるDPの定義で問題を解くこともできます。

\(DP[i][j]:=\) 完全二分木のノード\( i\) において、勝ち上がった人がその上でさらに\(j\)回勝ったときの、ノード\(i\)に所属する人が得られる賞金の合計の最大値

\(DP[l]\)\(DP[r] \)をマージし、\(DP[lr][i]\)を計算するときの遷移は、どちらの勝ち上がり者が勝つかを両方調べ、\(DP[l]\)\(DP[r]\)の時点では 負ける方は\(0\)回勝ち、勝つ方は\(i+1\)回勝つので、下記の通りになります。トーナメントの段階が\(1\)上がるので、残り勝ち回数が\(1\)減って、DP配列のサイズも\(1\)減ることに注意してください。

\(DP[lr][i]=max(DP[l][0]+DP[r][i+1],DP[l][i+1]+DP[r][0])\)

実装例(python) この実装では完全二分木の性質を使ってdequeで先頭2つのdpをpopしてマージ結果を末尾に追加することで遷移しています。

posted:
last update: