/*
一个类似24点的游戏,假设牌桌上有无数张1-10的牌,然后你手上的牌的总和是k,现在你可以随机到牌桌上抽牌加到总和里,如果你手上牌的总和在20-25之间就是win,如果总和超过25就是lose,现在让你求lose的概率。
这一题我好像在地里见到过但是当时那个楼主说他没有做出来,所以我就也附上一下我的大概解法。
首先因为每张牌都是无数张,所以抽任何一张牌的概率都是0.1。然后就是要考虑到有很多重复的情况,所以用dp或者recursion with memoization其实都可以。
我是用dp做的,从后往前推,所有的结束可能就是20 - 29 其中P(20)到P(25)= 0, P(26)到P(29) = 1。那么P(19) = 0.1*P(20) + 0.1*P(21)+.... 以此类推,最后算到P(k)
followup:假设每张牌是n张.
这就比较麻烦了,因为抽牌的概率跟当前牌桌上每张牌的数量有关,所以用dp比较难做,我就改用recursion with memoization。不仅要存手上牌的总和还要存牌桌上每张牌的数量。 */
public class Main {
public static void main(String[] args) { //System.out.println(new Solution().chanceToLose());
//System.out.println("Hello World!");
System.out.println(new Solution().chanceToLose2(10));
}
} class Solution{
public double chanceToLose(){
HashMap<Integer, Double> map = new HashMap<>();
return dfs(0,map);
} public double dfs(int sum, HashMap<Integer, Double> map){
if(map.containsKey(sum)){
return map.get(sum);
} double p = 0; if(sum >= 20 && sum <= 25){
p = 0;
}
else if(sum > 25){
p = 1;
}
else{
double pp=0;
for(int i = 1; i <= 10; i++){
pp=pp+0.1*dfs(sum + i, map);
}
p = pp;
}
map.put(sum, p);
return p;
} public double chanceToLose2(int n){
HashMap<Integer, Integer> cardsLeft = new HashMap<>();
for(int i=1; i<=10; i++){
cardsLeft.put(i, n);
}
return dfs2(0, n*10, cardsLeft);
} public double dfs2(int sum, int n, HashMap<Integer, Integer> cardsLeft){
double p = 0;
if(sum >= 20 && sum <= 25){
p = 0;
}
else if (sum > 25){
p = 1;
}
else{
for(int key : cardsLeft.keySet()){
int num = cardsLeft.get(key);
if(num > 0){
double cp = 1.0* num / n;
HashMap<Integer, Integer> cLeft = new HashMap<>(cardsLeft);
cLeft.put(key, num-1);
p = p + cp*dfs2(sum+key, n-1, cLeft);
}
}
}
return p;
} }

  

Google - chanceToLose24Game的更多相关文章

  1. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  2. linux上使用google身份验证器(简版)

    系统:centos6.6 下载google身份验证包google-authenticator-master(其实只是一个.zip文件,在windwos下解压,然后传进linux) #cd /data/ ...

  3. Google软件构建工具Bazel原理及使用方法介绍

    近期,Google开源了强大的自动化构建工具Bazel. 正好博主近期在使用china版的Bazel--腾讯自主开发的Blade,所以准备跟大家分享一下Google Bazel这个分布式构建系统的原理 ...

  4. Google Java编程库Guava介绍

    本系列想介绍下Java下开源的优秀编程库--Guava[ˈgwɑːvə].它包含了Google在Java项目中使用一些核心库,包含集合(Collections),缓存(Caching),并发编程库(C ...

  5. 序列化笔记之一:Google的Protocol Buffer格式分析

    从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作为一个学了多年通信的人,ProtocolBuffer在我看来是一种信源编码.所谓信 ...

  6. [异常解决] How make ubuntu use Google Search

    1.Download the hosts file fromhttps://laod.cn/hosts/2016-google-hosts.html [1] 2.Write a bash shell ...

  7. Google翻译之路

    如何将整个网站都翻译成某种语言,想必大家都有碰到这样的问题吧. 如果能够访问Google的话, 那这个太容易不过了. 来看,下面的就是Google提供的直接翻译某个网站. http://transla ...

  8. 使用google 语言 api 来实现整个网站的翻译

    ---恢复内容开始--- 使用google 语言 api 来实现整个网站的翻译,这时我们可以利用免费的google api来做处理来实现多语言的功能. 放在 HTML 文件中 <div id=& ...

  9. [转载]Google Guava官方教程(中文版)

      原文链接  译文链接 译者: 沈义扬,罗立树,何一昕,武祖  校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] ...

随机推荐

  1. MapReduce编程:平均成绩

    问题描述 现在有三个文件分别代表学生的各科成绩,编程求各位同学的平均成绩.                     编程思想 map函数将姓名作为key,成绩作为value输出,reduce根据key ...

  2. NodeJS:(二)基础常用API

    node.js中文网:http://nodejs.cn/api/ (path.Buffer.events.fs) ①path路径-----const {resolve} = require('path ...

  3. Angular 学习笔记 (组件沟通的思考)

    组件指令间经常需要沟通 我们知道的方式有 input output service inject viewchild contentchild templateRef template variabl ...

  4. vscode ----> 学习笔记

    java开发环境 jdk配置 maven配置 file --> preferences --> settings 在search settings搜索关键词 java.home , mav ...

  5. CentOS 每个版本的区别

    当我们下载CentOS 7 时会发现有几个版本可以选择,如下: 1.CentOS-7-DVD版本:DVD是标准安装盘,一般下载这个就可以了. 2.CentOS-7-NetInstall版本:网络安装镜 ...

  6. 为什么企业需要IT资产管理

    为什么企业需要IT资产管理 为什么企业需要IT资产管理?其实这个问题,如同企业为什么要管理一样重要. 企业需要管理.因为有了管理,人.物可尽其用,在不同的位置.角色上发挥作用,然后按照一定的运维规则, ...

  7. AWK入门

    AWK类型    AWK:源于AT&T实验室的AWK    NAWK:AWK的升级版    GAWK:GNU AWK,兼容AWK和NAWK    程序结构    BEGIN语句块,可选     ...

  8. LAMP架构上(一)

    第十七课LAMP架构上(一) 目录 一.LAMP架构介绍 二.MySQL.MariaDB介绍 三.MySQL安装 四.MariaDB安装 五.Apache安装 六.安装PHP5 七.安装PHP7 八. ...

  9. SQL JOIN语法,以及JOIN where 和and区别,还有where和join效率问题。

    语法 join 用于根据两个或多个表中的列之间的关系,从这些表中查询数据. Join 和 Key 有时为了得到完整的结果,我们需要从两个或更多的表中获取结果.我们就需要执行 join. 数据库中的表可 ...

  10. 何在mysql查找效率慢的SQL语句?

    如何在mysql查找效率慢的SQL语句呢?这可能是困然很多人的一个问题,MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启 ...