2021年2月3日水曜日

CODE FESTIVAL 2014 決勝 H - 部屋割り

ii人目が入る部屋の人数は決まっていて、シミュレーションで求まる。ii人目がf[i]f[i]人の部屋に入ったとする。また、

  • dp[i][x]:=i\operatorname{dp}[i][x] := i人が部屋に入った時点でxx人部屋であるような部屋の、最終的な人数の期待値
  • num[i][x]:=i\operatorname{num}[i][x] := i人が部屋に入った時点でxx人部屋であるような部屋の数

とすると、後ろからDPできる:

dp[i][f[i+1]]=dp[i+1][f[i+1]+1]+dp[i+1][f[i+1]]num[i+1][f[i+1]]num[i+1][f[i+1]]+1 \operatorname{dp}[i][f[i+1]] = \frac{\operatorname{dp}[i+1][f[i+1]+1] + \operatorname{dp}[i+1][f[i+1]]\operatorname{num}[i+1][f[i+1]]}{\operatorname{num}[i+1][f[i+1]] + 1}

num[i][f[i+1]]=num[i+1][f[i+1]]+1\operatorname{num}[i][f[i+1]] = \operatorname{num}[i+1][f[i+1]] + 1
num[i][f[i+1]+1]=num[i+1][f[i+1]+1]1\operatorname{num}[i][f[i+1]+1] = \operatorname{num}[i+1][f[i+1]+1] - 1

更新箇所が定数個しかないので、in-placeにDPすればO(N){O}(N)になる。ii人目に関する期待値はdp[i][f[i]+1]\operatorname{dp}[i][f[i]+1]に等しい。