爱丽丝参与一个大致基于纸牌游戏 “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

提示:

  1. 0 <= K <= N <= 10000
  2. 1 <= W <= 10000
  3. 如果答案与正确答案的误差不超过 10^-5,则该答案将被视为正确答案通过。
  4. 此问题的判断限制时间已经减少。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/new-21-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:根据leetcode官方解题思路,使用动态规划,设dp[i]表示从第i个数开始,经过若干轮之后,这个数的值在k到n之间的概率。

根据题意,当初始值i在k到n之间时,dp[i]=1,表示在从k到n之间的任意一个数,其位于k到n之间的概率为1,这也是我们代码中初始化的依据。

对于k到n之间的点,我们得到了其初始化的概率,那么对于值为k-1的数,其值不在k到n之间,那么它需要走一步才能到达k到n之间。但是这里存在一种情况,就是w的值可能大于n-k的值,也就是说k-1+w的值可能大于n,这样得到的值不是我们想要的,得让其概率表示为0;还有一种情况是w的值小于n-k,那么d[k-1]的值就是1了,表示值为k-1的点到k和n之间的概率为1。

对于dp[i],其概率计算公式为dp[i]=1w∗(dp[i+1]+dp[i+2]+...+dp[i+w])dp[i]=\frac{1}{w}*(dp[i+1]+dp[i+2]+...+dp[i+w])dp[i]=w1​∗(dp[i+1]+dp[i+2]+...+dp[i+w]),也就是说dp[i]的概率值是有其后面的w个数的概率值来决定的。

但是上面我们也说过了,w和n-k有两种情况,因此在初始化k到n的概率的时候,我们需要更多的内存来表示。具体来说,就是建立数组

vector<double> dp(n+w+1);  //为什么创建的数组不是dp(n+1)而是dp(n+w+1),下面代码中会有分析和解释
for(int i=k;i<=n;i++)  //这里表示从k到n的dp[i]的概率表示为1
{dp[i] = 1;
}
//因为每个dp[i]考虑的是其后面的w个数字的概率值,因此使用一个sum计算其后面w个数的概率值之和
//考虑到w和n-k的两种关系,对于k-1这个数,如果w>n-k,那么其实k-1下一步在k到n之间的概率值为w/(n-k),sum的值就表示n-k+1
//对于k-1这个数,如果w>n-k,那么其实k-1下一步在k到n之间的概率值为1,sum的值就表示w
if(w>=n-k+1)sum = double(n-k+1);
elsesum = w;

这样我们就确定了dp[k-1]的概率值,对于dp[k-2],其对应的概率值可以表示为dp[i]=1w∗(sum+dp[i]−dp[i+w])dp[i] = \frac{1}{w}* (sum + dp[i] - dp[i+w])dp[i]=w1​∗(sum+dp[i]−dp[i+w])。因为w表示所有可能走的步长,因此每一次迭代更新,只要加上最新的一个,并且减去最后的一个就可以得到我们需要的结果。但是前面说了,因为w和n-k之间存在两种情况,因此为了方面迭代,初始化数组的时候使用了vector dp(n+w+1); 目的就是保证在两种情况下的计算。

其具体的c++代码如下:

class Solution {public:double new21Game(int n, int k, int w) {vector<double> dp(n+w+1);  //初始化数组,注意是n+w+1而不是n+1double sum=0;  //用于计算w个数对应的概率值之和for(int i=k;i<=n;i++)   //将k到n之间的概率值表示为1{dp[i] = 1;}if(w>=n-k+1)  //如果w>=n-k+1,sum初始化为n-k+1,意思是w种选择中只有n-k+1种符合需求sum = double(n-k+1);else    //如果如果w<n-k+1,sum初始化为w,意思是w种选择都符合需求sum = w;for(int i=k-1;i>=0;i--){dp[i] = sum/double(w);  //首先计算dp[k-1]的对应的概率值sum = sum + dp[i] - dp[i+w];  //然后以k-1这个数为起点,sum加上dp[k-1]的值,减去dp[k-1+w]的值,作为sum的新一轮迭代的值}return dp[0];}
};

leetcode - 837. 新21点相关推荐

  1. Java实现 LeetCode 837 新21点(DP)

    837. 新21点 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范 ...

  2. LeetCode 837. 新21点(动态规划)

    文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 优化 1. 题目 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分 ...

  3. java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面

    LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...

  4. [Leedcode][JAVA][第837题][新21点][动态规划][数学]

    [问题描述][中等] 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范 ...

  5. leetcode算法题--新21点★

    原题链接:https://leetcode-cn.com/problems/new-21-game/ 1.递归 double new21Game(int N, int K, int W) {if (K ...

  6. 837. New 21 Game

    Title 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范围中随机 ...

  7. 博观而约取 温故以知新——“21世纪的计算大会”报道

    文/刘江 2012 年 10 月 25 日,坐在富丽堂皇的天津大礼堂里,与天津各高校的两千多师生一起聆听 " 21 世纪的计算大会 " 的报告,不由得感慨如今的年轻人在求学阶段就能 ...

  8. Leetcode--837. 新21点(java)

    爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范围中随机获得一个整数 ...

  9. 学渣的刷题之旅 leetcode刷题 21.合并两个有序列表

    将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 输入:1->2->4, 1->3->4 输出:1->1->2-> ...

最新文章

  1. 前目的地罗伯森是谁_前目的地谁演的,前目的地的扮演者罗伯森先生资料介绍-易看TV...
  2. 记一次 解决 vue 兼容ie11 的问题
  3. tq2440实验手册qt编译问题
  4. struts 中的创建Action的三种方法
  5. 一位大学教授学习数学的体会
  6. 一个有第三方ebuild的网站
  7. 问题 G: 最小的回文数
  8. Docker: vmware企业级docker镜像私服--Harbor的搭建
  9. CSS中flex和inline-flex的区别
  10. a.使用new关键字产生对象会调用构造方法_JAVA创建对象的几种方式
  11. MyEclipse中搭建spring-boot+mybatis+freemarker框架
  12. 在家远程办公效率低?那你一定要收好这个「在家办公」神器!
  13. webApi2 上传大文件代码
  14. 服务器安装谷歌浏览器
  15. 传统文化千千问重磅来袭!边玩边学,答题赢Kindle、全年免单大奖!——心田花开
  16. 【正本清源】算力大战根本就从未开始过!BCH分叉事件之技术细节七问
  17. outlook怎么配置126邮箱服务器,outlook 如何配置126邮箱
  18. 开心网android客户端,开心网Android客户端V3.8.1升级评测
  19. 全面了解ADSL,让你上网更轻松
  20. 浅谈JSP的发展历史

热门文章

  1. hibernate的查询缓存
  2. 在CentOS上安装NodeJS_v14.x
  3. 图片服务 - thumbor过滤器
  4. ElasticSearch--Jdbc导入插件
  5. MTU(Maximum Transmission Unit),最大传输单元
  6. json写入数据库或生成excel
  7. 算法训练营 重编码_关于如何在没有训练营的情况下学习编码的10条提示
  8. 静态组件_静态网站的出色附加组件,可让您跳舞
  9. aws dynamodb_如何使用AWS Lambda将DynamoDB集成到您的API中
  10. 测试常用——linux 基础命令