leetcode - 837. 新21点
爱丽丝参与一个大致基于纸牌游戏 “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,则该答案将被视为正确答案通过。
- 此问题的判断限制时间已经减少。
来源:力扣(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点相关推荐
- Java实现 LeetCode 837 新21点(DP)
837. 新21点 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范 ...
- LeetCode 837. 新21点(动态规划)
文章目录 1. 题目 2. 解题 2.1 暴力超时 2.2 优化 1. 题目 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分 ...
- java 取数组的前90位,LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面
LeetCode 面试题21. 调整数组顺序使奇数位于偶数前面 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分. 示例: 输入 ...
- [Leedcode][JAVA][第837题][新21点][动态规划][数学]
[问题描述][中等] 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下:爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范 ...
- leetcode算法题--新21点★
原题链接:https://leetcode-cn.com/problems/new-21-game/ 1.递归 double new21Game(int N, int K, int W) {if (K ...
- 837. New 21 Game
Title 爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范围中随机 ...
- 博观而约取 温故以知新——“21世纪的计算大会”报道
文/刘江 2012 年 10 月 25 日,坐在富丽堂皇的天津大礼堂里,与天津各高校的两千多师生一起聆听 " 21 世纪的计算大会 " 的报告,不由得感慨如今的年轻人在求学阶段就能 ...
- Leetcode--837. 新21点(java)
爱丽丝参与一个大致基于纸牌游戏 "21点" 规则的游戏,描述如下: 爱丽丝以 0 分开始,并在她的得分少于 K 分时抽取数字. 抽取时,她从 [1, W] 的范围中随机获得一个整数 ...
- 学渣的刷题之旅 leetcode刷题 21.合并两个有序列表
将两个有序链表合并为一个新的有序链表并返回.新链表是通过拼接给定的两个链表的所有节点组成的. 输入:1->2->4, 1->3->4 输出:1->1->2-> ...
最新文章
- 前目的地罗伯森是谁_前目的地谁演的,前目的地的扮演者罗伯森先生资料介绍-易看TV...
- 记一次 解决 vue 兼容ie11 的问题
- tq2440实验手册qt编译问题
- struts 中的创建Action的三种方法
- 一位大学教授学习数学的体会
- 一个有第三方ebuild的网站
- 问题 G: 最小的回文数
- Docker: vmware企业级docker镜像私服--Harbor的搭建
- CSS中flex和inline-flex的区别
- a.使用new关键字产生对象会调用构造方法_JAVA创建对象的几种方式
- MyEclipse中搭建spring-boot+mybatis+freemarker框架
- 在家远程办公效率低?那你一定要收好这个「在家办公」神器!
- webApi2 上传大文件代码
- 服务器安装谷歌浏览器
- 传统文化千千问重磅来袭!边玩边学,答题赢Kindle、全年免单大奖!——心田花开
- 【正本清源】算力大战根本就从未开始过!BCH分叉事件之技术细节七问
- outlook怎么配置126邮箱服务器,outlook 如何配置126邮箱
- 开心网android客户端,开心网Android客户端V3.8.1升级评测
- 全面了解ADSL,让你上网更轻松
- 浅谈JSP的发展历史
热门文章
- hibernate的查询缓存
- 在CentOS上安装NodeJS_v14.x
- 图片服务 - thumbor过滤器
- ElasticSearch--Jdbc导入插件
- MTU(Maximum Transmission Unit),最大传输单元
- json写入数据库或生成excel
- 算法训练营 重编码_关于如何在没有训练营的情况下学习编码的10条提示
- 静态组件_静态网站的出色附加组件,可让您跳舞
- aws dynamodb_如何使用AWS Lambda将DynamoDB集成到您的API中
- 测试常用——linux 基础命令