結果

問題 No.108 トリプルカードコンプ
ユーザー rpy3cpprpy3cpp
提出日時 2015-07-17 01:38:30
言語 Python3
(3.12.2 + numpy 1.26.4 + scipy 1.12.0)
結果
AC  
実行時間 265 ms / 5,000 ms
コード長 1,244 bytes
コンパイル時間 70 ms
コンパイル使用メモリ 10,940 KB
実行使用メモリ 22,608 KB
最終ジャッジ日時 2023-09-22 16:52:29
合計ジャッジ時間 2,316 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 15 ms
7,812 KB
testcase_01 AC 16 ms
7,788 KB
testcase_02 AC 16 ms
7,816 KB
testcase_03 AC 16 ms
7,960 KB
testcase_04 AC 16 ms
7,864 KB
testcase_05 AC 17 ms
7,768 KB
testcase_06 AC 16 ms
7,812 KB
testcase_07 AC 265 ms
22,608 KB
testcase_08 AC 52 ms
17,176 KB
testcase_09 AC 49 ms
17,168 KB
testcase_10 AC 16 ms
7,880 KB
testcase_11 AC 15 ms
7,768 KB
testcase_12 AC 16 ms
7,828 KB
testcase_13 AC 31 ms
9,428 KB
testcase_14 AC 22 ms
9,172 KB
testcase_15 AC 19 ms
8,892 KB
testcase_16 AC 26 ms
9,288 KB
testcase_17 AC 16 ms
8,396 KB
testcase_18 AC 196 ms
19,360 KB
testcase_19 AC 86 ms
15,580 KB
testcase_20 AC 61 ms
16,004 KB
testcase_21 AC 143 ms
18,188 KB
testcase_22 AC 20 ms
8,520 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

def solve(N, A):
    '''
    dp[i][j][k] 0枚のカードがi種類、1枚のカードがj種類、2枚のカードがk種類のときに、
              全ての種類のカードで3枚以上入手するまで引く回数の期待値とする。
    dp[i][j][k] =  1 + dp[i][j][k]*(N-i-j-k)/N
                     + dp[i][j][k-1]*k/N
                     + dp[i][j-1][k+1]*j/N
                     + dp[i-1][j+1][k]*i/N
    ->
    dp[i][j][k] = (N + dp[i][j][k-1]*k + dp[i][j-1][k+1]*j + dp[i-1][j+1][k]*i)/(i+j+k)
    '''
    global memo
    n0 = A.count(0)
    n1 = A.count(1)
    n2 = A.count(2)
    ns = n0 + n1 + n2 + 1
    memo = [[[-1]*ns for j in range(ns)] for k in range(ns)]
    memo[0][0][0] = 0
    return dp(n0, n1, n2, n0+n1+n2, N)

memo = []
def dp(n0, n1, n2, n_sum, N):
    global memo
    if n0 + n1 + n2 > n_sum or n0 < 0 or n1 < 0 or n2 < 0:
        return 0
    v = memo[n0][n1][n2]
    if v != -1:
        return v
    v = (N + dp(n0, n1, n2 - 1, n_sum, N) * n2
           + dp(n0, n1 - 1, n2 + 1, n_sum, N) * n1
           + dp(n0 - 1, n1 + 1, n2, n_sum, N) * n0)/(n0 + n1 + n2)
    memo[n0][n1][n2] = v
    return v
    
N = int(input())
As = list(map(int, input().split()))
print(solve(N, As))
0