問題
I – Coins
確率DPの問題。
参考資料
回答
TLEだった回答
PyPyではAC。
import sys # input処理を高速化する input = sys.stdin.readline def main(): N = int(input()) lst_p = list(map(float, input().split())) # dp[i][j] := 最初の i 枚のコインを投げたときに、表が j 枚となる確率 # 次のコインが表: dp[i+1][j+1] += dp[i][j]∗p[i] # 次のコインが裏: dp[i+1][j] += dp[i][j]∗(1.0−p[i]) dp = [[0] * (N+1) for i in range(N+1)] # 初期条件 dp[0][0] = 1.0 for i in range(N): for j in range(N): dp[i+1][j+1] += dp[i][j] * lst_p[i] dp[i+1][j] += dp[i][j] * (1.0 - lst_p[i]) ans = 0 for i in range((N+1)//2, N+1): ans += dp[N][i] print(ans) main()
ACだった回答
import sys # input処理を高速化する input = sys.stdin.readline def main(): N = int(input()) p = list(map(float, input().split())) # dp[j] := 表が j 枚となる確率 # dp[j] = dp[j-1]*p[i] + dp[j]*(1-p[i]) ただしdp[j]が重複していることに注意 dp = [0.0] * (N+1) # 初期条件 dp[0]= 1.0 for i in range(N): p_head = p[i] p_tail = 1 - p[i] dp = [dp[j -1] * p_head + dp[j] * p_tail for j in range(N+1)] ans = sum(dp[(N//2+1):]) print(ans) main()