题目

爱丽丝参与一个大致基于纸牌游戏 “21点” 规则的游戏,描述如下:

爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1, W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。

当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少?

链接:https://leetcode-cn.com/problems/new-21-game

思路

image.png

代码

  1. class Solution:
  2. def new21Game(self, N: int, K: int, W: int) -> float:
  3. dp = [None]*(K+W)
  4. cusum = 0 # 累积和
  5. for i in range(K, K+W):
  6. if i <= N:
  7. dp[i] = 1
  8. cusum += dp[i]
  9. else:
  10. dp[i] = 0
  11. for i in range(K-1, -1, -1):
  12. dp[i] = cusum / W
  13. cusum += (dp[i] - dp[i+W]) # 改变累积和,因为i向前挪动过了1个单位,再抽一张牌的牌面值最多i-1+w,因此要-dp[i+w]
  14. return dp[0]