LC 837. New 21 Game
https://leetcode.com/problems/new-21-game/
把公式写出来的时候就容易想到使用滑动窗口来减少计算量了。
# note(yan): dp[n] 表示无论取多少次,取到n的概率
# dp[n] = dp[n-1] * 1/w + dp[n-2] * 1/w + ...d[n-w] *1/w
# 但是(dp[n-1] + .. dp[n-w]) 可以使用sliding window来计算
class Solution:
def new21Game(self, N: int, K: int, W: int) -> float:
if K == 0 or (N - K) >= W:
return 1.0
dp = [0] * (N + 1)
dp[0] = 1.0
sw = 1.0
for i in range(1, N + 1):
dp[i] = 1 / W * sw
if i < K:
sw += dp[i]
if i >= W:
sw -= dp[i - W]
ans = sum(dp[K:])
return round(ans, 5)