本文最后更新于 2025-03-30T12:48:35+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 ,则该答案将被视为正确答案通过。 此问题的判断限制时间已经减少。
题目思路
1、本题不止使用滑动窗口题目来减小数据计算的重复度,而且需要使用动态规划来解决问题的状态方程。
2、本题意思为,从 0 开始,每次手中的牌如果小于 x,则从[1, w]随机抽一张,概率互相独立,均为 1 / w,令 dp[x] 表示从得分为 x 的情况开始游戏并且获胜的概率,目标是求 dp[0] 的值。本题目总给人一种条件概率求其中某一部分的全概率公式的感觉,前一次抽取的结果会影响到下一次的抽取结果以及结论,又跟马尔科夫链同出一辙,果断查看书籍,发现的确是如此,那么应用马尔可夫链的相关结论,可以得到状态转移方程 $$ dp\left[ x \right] =\frac{\sum_{i=1}^w{dp\left[ x,,+,,i \right]}}{w} $$
3、本题应属于困难的题目,思想方法难以理解,需要较强的概率论基础。
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/