def solve(N, AS):
"void()"
from collections import Counter
count = Counter(AS)
expect = {}
expect[(0, 0, 0)] = 0
def f(a, b, c):
if (a, b, c) in expect:
return expect[(a, b, c)]
p = 1.0
if a > 0:
p += f(a - 1, b, c) * a / N
if b > 0:
p += f(a + 1, b - 1, c) * b / N
if c > 0:
p += f(a, b + 1, c - 1) * c / N
p *= N / (a + b + c)
# debug("f: a,b,c,p", a, b, c, p)
expect[(a, b, c)] = p
return p
return f(count[1], count[2], count[3])
少し書き直してAC
python
def solve(N, AS):
from collections import Counter
count = Counter(AS)
expect = [[[-1] * (N + 1) for i in range(N + 1)] for j in range(N + 1)]
expect[0][0][0] = 0
def f(a, b, c):
p = N
if a > 0:
v = expect[a - 1][b][c]
if v == -1:
v = f(a - 1, b, c)
p += v * a
if b > 0:
v = expect[a + 1][b - 1][c]
if v == -1:
v = f(a + 1, b - 1, c)
p += v * b
if c > 0:
v = expect[a][b + 1][c - 1]
if v == -1:
v = f(a, b + 1, c - 1)
p += v * c
p /= (a + b + c)
# debug("f: a,b,c,p", a, b, c, p)
expect[a][b][c] = p
return p
return f(count[1], count[2], count[3])