Educational DP Contest

Educational DP Contest - AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
問題

I - Coins
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

方針
表の枚数が\(i\)枚である確率をDP[i]とする。こうするとDPテーブルは\(1\)次元で良い。
解答
#atcoder template
def main():
import sys
input = sys.stdin.readline
#文字列入力の時は上記はerrorとなる。
#ここにコード
#表の枚数がn枚である確率をdp[n]とする。
import numpy as np
n = int(input())
p = list(map(float, input().split()))
dp = np.zeros((n+1), np.float64)
dp[0] = 1-p[0]
dp[1] = p[0]
for i in range(1, n):
dp[i+1] = p[i]*dp[i]
dp[1:i+1] = (1-p[i])*dp[1:i+1] + p[i]*dp[0:i]
dp[0] *= (1-p[i])
print(sum(dp[(n+1)//2:]))
#N = 1のときなどcorner caseを確認!
if __name__ == "__main__":
main()
提出結果

Submission #32062330 - Educational DP Contest
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
補足
for i in range(1, n):
dp[i+1] = p[i]*dp[i]
dp[1:i+1] = (1-p[i])*dp[1:i+1] + p[i]*dp[0:i]
dp[0] *= (1-p[i])
の部分は順番が大事で、最初に一番右のdp[i+1]、その次に真ん中のdp[1:i+1]、最後に一番左のdp[0]を更新する。こうしないと更新された値を用いてDPの更新を行ってしまうので間違いになる。ここらへんをnumpyを使わずやろうとしたけど、なかなかうまく行かなかった。
関連問題
A-Frog 1
B-Frog 2
C-Vacation
D-Knapsack 1
E-Knapsack 2
F-LCS
G-Longest Path
H-Grid 1
関連リンク

AtCoder
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
コメント