i人目が入る部屋の人数は決まっていて、シミュレーションで求まる。i人目がf[i]人の部屋に入ったとする。また、
- dp[i][x]:=i人が部屋に入った時点でx人部屋であるような部屋の、最終的な人数の期待値
- num[i][x]:=i人が部屋に入った時点でx人部屋であるような部屋の数
とすると、後ろからDPできる:
dp[i][f[i+1]]=num[i+1][f[i+1]]+1dp[i+1][f[i+1]+1]+dp[i+1][f[i+1]]num[i+1][f[i+1]]
num[i][f[i+1]]=num[i+1][f[i+1]]+1
num[i][f[i+1]+1]=num[i+1][f[i+1]+1]−1
更新箇所が定数個しかないので、in-placeにDPすればO(N)になる。i人目に関する期待値はdp[i][f[i]+1]に等しい。