Buggy python submission (verdict: Time Limit Exceeded):
#解説AC
n=int(input())
a=list(map(int,input().split()))
dp=[[[-1]*(301) for i in range(301)] for j in range(301)]
# dp[a][b][c]=(1個の皿がa枚,2個の皿がb枚,3個の皿がc枚ある時, 全て食べ終わるまでの操作回数の期待値)
# dp[a][b][c]の遷移
#               確率          行先
# 1枚が引かれる  a/N　　　    dp[a-1][b][c]
# 2枚が引かれる  b/N　　　    dp[a+1][b-1][c]
# 3枚が引かれる  c/N　　　    dp[a][b+1][c-1]
# 0枚が引かれる  (N-a-b-c)/N　dp[a][b][c]

#dp[a][b][c]=dp[a-1][b][c]*a/n+dp[a+1][b-1][c]*b/n+dp[a][b+1][c-1]*c/n+dp[a][b][c]*(n-a-b-c)/n+1
#dp[a][b][c]=(dp[a-1][b][c]*a+dp[a+1][b-1][c]*b+dp[a][b+1][c-1]*c+n)/(a+b+c)

def memo(i,j,k):
    if dp[i][j][k]+1:
        return dp[i][j][k]
    ans=n
    if i>0:
        ans+=memo(i-1,j,k)*i
    if j>0:
        ans+=memo(i+1,j-1,k)*j
    if k>0:
        ans+=memo(i,j+1,k-1)*k
    dp[i][j][k]=ans/(i+j+k)
    return ans/(i+j+k)
dp[0][0][0]=0
x,y,z=0,0,0
for i in a:
    if i==1:
        x+=1
    elif i==2:
        y+=1
    else:
        z+=1
print(memo(x,y,z))

Fixed submission:
#解説AC
n=int(input())
a=list(map(int,input().split()))
dp=[[[-1]*(301) for i in range(301)] for j in range(301)]
# dp[a][b][c]=(1個の皿がa枚,2個の皿がb枚,3個の皿がc枚ある時, 全て食べ終わるまでの操作回数の期待値)
# dp[a][b][c]の遷移
#               確率          行先
# 1枚が引かれる  a/N　　　    dp[a-1][b][c]
# 2枚が引かれる  b/N　　　    dp[a+1][b-1][c]
# 3枚が引かれる  c/N　　　    dp[a][b+1][c-1]
# 0枚が引かれる  (N-a-b-c)/N　dp[a][b][c]

#dp[a][b][c]=dp[a-1][b][c]*a/n+dp[a+1][b-1][c]*b/n+dp[a][b+1][c-1]*c/n+dp[a][b][c]*(n-a-b-c)/n+1
#dp[a][b][c]=(dp[a-1][b][c]*a+dp[a+1][b-1][c]*b+dp[a][b+1][c-1]*c+n)/(a+b+c)

def memo(i,j,k):
    if dp[i][j][k]+1:
        return dp[i][j][k]
    ans=n
    if i>0:
        ans+=memo(i-1,j,k)*i
    if j>0:
        ans+=memo(i+1,j-1,k)*j
    if k>0:
        ans+=memo(i,j+1,k-1)*k
    dp[i][j][k]=ans/(i+j+k)
    return ans/(i+j+k)
dp[0][0][0]=0
x,y,z=0,0,0
for i in a:
    if i==1:
        x+=1
    elif i==2:
        y+=1
    else:
        z+=1
print(memo(x,y,z))

Buggy python submission (verdict: Time Limit Exceeded):
#解説AC
n=int(input())
a=list(map(int,input().split()))
dp=[[[-1]*(n+1) for i in range(n+1)] for j in range(n+1)]
# dp[a][b][c]=(1個の皿がa枚,2個の皿がb枚,3個の皿がc枚ある時, 全て食べ終わるまでの操作回数の期待値)
# dp[a][b][c]の遷移
#               確率          行先
# 1枚が引かれる  a/N　　　    dp[a-1][b][c]
# 2枚が引かれる  b/N　　　    dp[a+1][b-1][c]
# 3枚が引かれる  c/N　　　    dp[a][b+1][c-1]
# 0枚が引かれる  (N-a-b-c)/N　dp[a][b][c]

#dp[a][b][c]=dp[a-1][b][c]*a/n+dp[a+1][b-1][c]*b/n+dp[a][b+1][c-1]*c/n+dp[a][b][c]*(n-a-b-c)/n+1
#dp[a][b][c]=(dp[a-1][b][c]*a+dp[a+1][b-1][c]*b+dp[a][b+1][c-1]*c+n)/(a+b+c)

def memo(i,j,k):
    if dp[i][j][k]+1:
        return dp[i][j][k]
    ans=n
    if i>0:
        ans+=memo(i-1,j,k)*i
    if j>0:
        ans+=memo(i+1,j-1,k)*j
    if k>0:
        ans+=memo(i,j+1,k-1)*k
    dp[i][j][k]=ans/(i+j+k)
    return ans/(i+j+k)
dp[0][0][0]=0
x,y,z=0,0,0
for i in a:
    if i==1:
        x+=1
    elif i==2:
        y+=1
    else:
        z+=1
print(memo(x,y,z))

Fixed submission:
#解説AC
n=int(input())
a=list(map(int,input().split()))
dp=[[[-1]*(301) for i in range(301)] for j in range(301)]
# dp[a][b][c]=(1個の皿がa枚,2個の皿がb枚,3個の皿がc枚ある時, 全て食べ終わるまでの操作回数の期待値)
# dp[a][b][c]の遷移
#               確率          行先
# 1枚が引かれる  a/N　　　    dp[a-1][b][c]
# 2枚が引かれる  b/N　　　    dp[a+1][b-1][c]
# 3枚が引かれる  c/N　　　    dp[a][b+1][c-1]
# 0枚が引かれる  (N-a-b-c)/N　dp[a][b][c]

#dp[a][b][c]=dp[a-1][b][c]*a/n+dp[a+1][b-1][c]*b/n+dp[a][b+1][c-1]*c/n+dp[a][b][c]*(n-a-b-c)/n+1
#dp[a][b][c]=(dp[a-1][b][c]*a+dp[a+1][b-1][c]*b+dp[a][b+1][c-1]*c+n)/(a+b+c)

def memo(i,j,k):
    if dp[i][j][k]+1:
        return dp[i][j][k]
    ans=n
    if i>0:
        ans+=memo(i-1,j,k)*i
    if j>0:
        ans+=memo(i+1,j-1,k)*j
    if k>0:
        ans+=memo(i,j+1,k-1)*k
    dp[i][j][k]=ans/(i+j+k)
    return ans/(i+j+k)
dp[0][0][0]=0
x,y,z=0,0,0
for i in a:
    if i==1:
        x+=1
    elif i==2:
        y+=1
    else:
        z+=1
print(memo(x,y,z))

Buggy python submission (verdict: Time Limit Exceeded):
#解説AC
n=int(input())
a=list(map(int,input().split()))
dp=[[[-1]*(n+1) for i in range(n+1)] for j in range(n+1)]
# dp[a][b][c]=(1個の皿がa枚,2個の皿がb枚,3個の皿がc枚ある時, 全て食べ終わるまでの操作回数の期待値)
# dp[a][b][c]の遷移
#               確率          行先
# 1枚が引かれる  a/N　　　    dp[a-1][b][c]
# 2枚が引かれる  b/N　　　    dp[a+1][b-1][c]
# 3枚が引かれる  c/N　　　    dp[a][b+1][c-1]
# 0枚が引かれる  (N-a-b-c)/N　dp[a][b][c]

#dp[a][b][c]=dp[a-1][b][c]*a/n+dp[a+1][b-1][c]*b/n+dp[a][b+1][c-1]*c/n+dp[a][b][c]*(n-a-b-c)/n+1
#dp[a][b][c]=(dp[a-1][b][c]*a+dp[a+1][b-1][c]*b+dp[a][b+1][c-1]*c+n)/(a+b+c)

def memo(i,j,k):
    if dp[i][j][k]+1:
        return dp[i][j][k]
    ans=n
    if i>0:
        ans+=memo(i-1,j,k)*i
    if j>0:
        ans+=memo(i+1,j-1,k)*j
    if k>0:
        ans+=memo(i,j+1,k-1)*k
    dp[i][j][k]=ans/(i+j+k)
    return ans/(i+j+k)
dp[0][0][0]=0
x,y,z=0,0,0
for i in a:
    if i==1:
        x+=1
    elif i==2:
        y+=1
    else:
        z+=1
print(memo(x,y,z))

Fixed submission:
#解説AC
n=int(input())
a=list(map(int,input().split()))
dp=[[[-1]*(301) for i in range(301)] for j in range(301)]
# dp[a][b][c]=(1個の皿がa枚,2個の皿がb枚,3個の皿がc枚ある時, 全て食べ終わるまでの操作回数の期待値)
# dp[a][b][c]の遷移
#               確率          行先
# 1枚が引かれる  a/N　　　    dp[a-1][b][c]
# 2枚が引かれる  b/N　　　    dp[a+1][b-1][c]
# 3枚が引かれる  c/N　　　    dp[a][b+1][c-1]
# 0枚が引かれる  (N-a-b-c)/N　dp[a][b][c]

#dp[a][b][c]=dp[a-1][b][c]*a/n+dp[a+1][b-1][c]*b/n+dp[a][b+1][c-1]*c/n+dp[a][b][c]*(n-a-b-c)/n+1
#dp[a][b][c]=(dp[a-1][b][c]*a+dp[a+1][b-1][c]*b+dp[a][b+1][c-1]*c+n)/(a+b+c)

def memo(i,j,k):
    if dp[i][j][k]+1:
        return dp[i][j][k]
    ans=n
    if i>0:
        ans+=memo(i-1,j,k)*i
    if j>0:
        ans+=memo(i+1,j-1,k)*j
    if k>0:
        ans+=memo(i,j+1,k-1)*k
    dp[i][j][k]=ans/(i+j+k)
    return ans/(i+j+k)
dp[0][0][0]=0
x,y,z=0,0,0
for i in a:
    if i==1:
        x+=1
    elif i==2:
        y+=1
    else:
        z+=1
print(memo(x,y,z))