[AtCoder][DP][競プロ][Educational DP Contest]I-Coins

antique bills business cash AtCoder
Photo by Pixabay on Pexels.com

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.

コメント

タイトルとURLをコピーしました