Pythonで理解する蟻本「2-7 Millionaire(2008 APAC local onsites C)」(p.123)
この記事は「プログラミングコンテストチャレンジブック第2版」(蟻本)の
「2-7 Millionaire(2008 APAC local onsites C)」(p.123)
のコードをPythonで書き直したものとなっています。
入力
入力例1
1 500000
0.5
入力例2
3 600000
0.75
解答
MAX_M = 15
# 入力
M, X = map(int,input().split())
P = float(input())
dp = [[0] * ((1 << MAX_M) + 1) for _ in range(2)]
n = 1 << M
prv = dp[0]
nxt = dp[1]
prv[n] = 1
for r in range(M):
for i in range(n + 1):
jub = min(i, n - i)
t = 0
for j in range(jub + 1):
t = max(t, P * prv[i + j] + (1 - P) * prv[i - j])
nxt[i] = t
prv, nxt = nxt, prv
i = X * n // 1000000
print(prv[i])