本题是动态规划问题,但递推关系比较复杂:
用一个14位二进制数m表示当前剩余的厨师,用$E(m,i)$表示在状态m下厨师i作选择时的最优期望菜肴数,$g(m,i)$表示此时的下一位人选,$m'$表示选择后的新状态,则有
$$E(m,i)=1+S(i)E(m',g(m',i))+(1-S(i))E(m,g(m,i)).$$
再用$W(m,i,j)$表示上述条件下j获胜的概率,则有
$$W(m,i,j)=S(i)W(m',g(m',i),j)+(1-S(i))W(m,g(m,i),j),$$
每次剔除获胜概率最高的对手,就能依次计算$W,g,E$,最终结果是$729.12106947$。
注:为便于格式化输出和作除法,以下代码为Python 3。
from itertools import product
n=14
F=[1.0, 1.0, 2.0, 3.0, 5.0, 8.0, 13.0, 21.0, 34.0, 55.0, 89.0, 144.0, 233.0, 377.0, 610.0]
for k in range(n+1):
F[k]/=F[n]
M=1 << n
dp=[[[0.0]*(n|1) for _ in range(n|1)] for _ in range(M|1)]
E=[[0.0]*(n|1) for _ in range(M|1)]
for s in range(1,M):
chefList=[k for k in range(n) if s & (1 << k)]
if len(chefList)==1:
dp[s][chefList[0]][chefList[0]]=1.0
continue
order=chefList*3
for (i,j), k in product(enumerate(chefList), chefList):
p=E0=E1=0.0
r=1.0
for x in range(i,i+len(chefList)):
opt=order[x]
optmask=mask=s^(1 << order[x+1])
optchef=order[x+2]
optprob=dp[optmask][optchef][opt]
chef=order[x+1]
for y in range(x+2, x+len(chefList)):
mask=s^(1 << order[y])
if dp[mask][chef][opt]>optprob:
optprob,optmask,optchef=dp[mask][chef][opt],mask,chef
p+=dp[optmask][optchef][k]*r*F[opt]
if j==k:
E0+=(x-i+1+E[optmask][optchef])*r*F[opt]
E1+=len(chefList)*r*F[opt]
r*=1-F[opt]
dp[s][j][k]=p/(1-r)
if j==k:
E[s][j]=E0/(1-r)+E1*r/(1-r)/(1-r)
print(f"{E[M-1][0]:.8f}")
|