本文最后更新于 2026-08-10T23:33:41+08:00
题目 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 爱丽丝参与一个大致基于纸牌游戏 “21 点” 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字。 抽取时,她从 [1 , W] 的范围中随机获得一个整数作为分数进行累计,其中 W 是整数。 每次抽取都是独立的,其结果具有相同的概率。 当爱丽丝获得不少于 K 分时,她就停止抽取数字。 爱丽丝的分数不超过 N 的概率是多少? 示例 1 : 输入:N = 10 , K = 1 , W = 10 输出:1.00000 说明:爱丽丝得到一张卡,然后停止。 示例 2 : 输入:N = 6 , K = 1 , W = 10 输出:0.60000 说明:爱丽丝得到一张卡,然后停止。 在 W = 10 的 6 种可能下,她的得分不超过 N = 6 分。 示例 3 : 输入:N = 21 , K = 17 , W = 10 输出:0.73278 提示:0 <= K <= N <= 10000 1 <= W <= 10000 如果答案与正确答案的误差不超过 10 ^-5 ,则该答案将被视为正确答案通过。 此问题的判断限制时间已经减少。
题目思路
本题不仅使用滑动窗口来减小重复计算,还需要用动态规划来建立状态转移方程。
题意是:从 0 分开始,手中分数小于 K 时就随机抽取,每次从 [1, W] 中抽到的概率互相独立,均为 1 / W。令 dp[x] 表示从得分为 x 的情况开始游戏并获胜的概率,目标是求 dp[0] 的值。整个题目给人一种用全概率公式求解条件概率的感觉,前一次抽取的结果会影响后续的抽取和结论,与马尔可夫链如出一辙;查了查书发现确实如此,于是应用马尔可夫链的相关结论,可以得到状态转移方程:
$$ dp\left[ x \right] =\frac{\sum_{i=1}^w{dp\left[ x,,+,,i \right]}}{w} $$
本题应该属于较难的题目,思想方法不易理解,需要较强的概率论基础。
题目代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class Solution {public : double new21Game (int n, int k, int w) { double dp[k + w]; memset (dp, 0 , sizeof (dp)); double ans = 0.0 ; for (int i = k; i < k + w; i++) { dp[i] = i <= n ? 1 : 0 ; ans += dp[i]; } for (int i = k-1 ; i >= 0 ; i--) { dp[i] = ans / w; ans = ans - dp[i + w] + dp[i]; } return dp[0 ]; } };
复杂度
时间复杂度:O(n + k)
空间复杂度:O(n + k)
Day 44 837. 新21点
https://chaggle.github.io/2021/10/23/leetcode/91-day/day-44-837-new-21-game/