ABC298E - Unfair Sugoroku

解法1:DP

考え方

youtu.be

回答例

dp[i][j][k] = 先手がiにいて, 後手がjにいて, 手番がk(0:先手,1:後手)のとき,先手が勝つ確率.

N, A, B, P, Q = map(int, input().split())

mod = 998244353
invP = pow(P, mod - 2, mod)
invQ = pow(Q, mod - 2, mod)

dp = [[[0] * 2 for _ in range(N + 1)] for _ in range(N + 1)]
for i in range(1, N):
    dp[N][i] = [1, 1]

for i in range(N - 1, A - 1, -1):
    for j in range(N - 1, B - 1, -1):
        for p in range(1, P + 1):
            dp[i][j][0] += dp[min(i + p, N)][j][1]
        dp[i][j][0] *= invP
        dp[i][j][0] %= mod
        for q in range(1, Q + 1):
            dp[i][j][1] += dp[i][min(j + q, N)][0]
        dp[i][j][1] *= invQ
        dp[i][j][1] %= mod

print(dp[A][B][0])


解法2:再帰

考え方

回答例