aacord’s memo

abcを中心にpythonで解いた問題のメモ、整理をしています。緑になった。

abc 184 D - increment of coins (python)

期待値でも遷移さえわかれば dp で求まるというやつ。
dp と メモ化再帰の両方で解いてみた。

a,b,c = map(int,input().split())
dp = [[[0]*101 for _ in range(101)] for i in range(101)]
for i in range(100,a-1,-1):
  for j in range(100,b-1,-1):
    for k in range(100,c-1,-1):
      if i == 100 or j == 100 or k == 100:
        continue
      else:
        dp[i][j][k] = (dp[i+1][j][k]+1)*i/(i+j+k)\
                    + (dp[i][j+1][k]+1)*j/(i+j+k)\
                    + (dp[i][j][k+1]+1)*k/(i+j+k)\
            
      
print(dp[a][b][c])

import sys
sys.setrecursionlimit(10**7)
from functools import lru_cache
a,b,c = map(int,input().split())

@lru_cache(maxsize=None)
def f(i,j,k):
    if i == 100 or j == 100 or k == 100:
        return 0
    return (f(i+1,j,k)+1)*i/(i+j+k)\
          +(f(i,j+1,k)+1)*j/(i+j+k)\
          +(f(i,j,k+1)+1)*k/(i+j+k)\
            
print(f(a,b,c))