2020-02-10 13:24:26

问题描述:

问题求解:

第一次看到这个题目的时候想到的是之前做过的一条概率题,就是那个国际象棋,那条题目的做法是使用dp去对所有留在棋盘的种类进行计数,然后除以总数。所以,我一开始的做法也是这样做的。

但是实际是不对的,问题就是最后得到的解的概率是不等的,所以不能简单的计数符合条件的个数和最后的总个数并相除,如下面的例子。

If you draw 1, then 9, probability is P(1) * P(9) = 0.1 * 0.1 = 0.01
If you draw 10, probability is P(10) = 0.1.

(1, 9) and (10) can't be simply regarded as combination candidates for they don't share the same probability

实际是需要使用dp来做的。

    public double new21Game(int N, int K, int W) {
if (N < K) return 0;
if (K == 0 || N >= K - 1 + W) return 1; int maxPoint = K + W - 1;
// probability[i] is probability of getting point i.
double[] probability = new double[maxPoint + 1]; probability[0] = 1;
for (int i = 1; i <= maxPoint; i++) {
for (int w = 1; w <= W; w++) {
if (i - w >= 0 && i - w < K)
probability[i] += probability[i - w] * 1 / W;
}
} double targetProbability = 0; // Probability of N or less points.
for (int i = K; i <= N; i++) {
targetProbability += probability[i];
} return targetProbability;
}

上述的代码非常简洁明了,但是会TLE。我们需要对它进行优化。

dp[i] = sum(dp[i - 1] + dp[i - 2] + ... + dp[i - w]) * 1 / W,如果我们使用dp[i]直接去存储sum(dp[0] + dp[1] + dp[2] + ... + dp[i]),那么dp[i] = (dp[i - 1] - dp[i - W - 1]) * 1 / W + dp[i - 1]。

这个里面如果i - w >= K是不能加入计算的,也就是当i >= K + w的时候就需要将部分的和去掉。

    public double new21Game(int N, int K, int W) {
if (N < K) return 0;
if (K == 0 || N >= K - 1 + W) return 1;
int max_point = K - 1 + W;
double[] dp = new double[max_point + 1];
dp[0] = 1;
for (int i = 1; i <= max_point; i++) {
if (i - W - 1 < 0) dp[i] = dp[i - 1] * (1.0 / W) + dp[i - 1];
else {
dp[i] = (dp[i - 1] - dp[i - W - 1]) * (1.0 / W) + dp[i - 1];
}
if (i > K) dp[i] -= (dp[i - 1] - dp[K - 1]) * (1.0 / W);
}
return dp[N] - dp[K - 1];
}

  

数学-概率-New 21 Game的更多相关文章

  1. Codeforces Round #370 (Div. 2) E. Memory and Casinos (数学&&概率&&线段树)

    题目链接: http://codeforces.com/contest/712/problem/E 题目大意: 一条直线上有n格,在第i格有pi的可能性向右走一格,1-pi的可能性向左走一格,有2中操 ...

  2. codeforces 711E E. ZS and The Birthday Paradox(数学+概率)

    题目链接: E. ZS and The Birthday Paradox. time limit per test 2 seconds memory limit per test 256 megaby ...

  3. CodeForces 621C 数学概率期望计算

    昨天训练赛的题..比划了好久才想出来什么意思 之前想的是暴力for循环求出来然后储存数组 后来又想了想 自己萌的可以.. 思路就是求出来每个人与他的右边的人在一起能拿钱的概率(V(或)的关系)然后*2 ...

  4. Codeforces 626D Jerry's Protest 「数学组合」「数学概率」

    题意: 一个袋子里装了n个球,每个球都有编号.甲乙二人从每次随机得从袋子里不放回的取出一个球,如果甲取出的球比乙取出的球编号大则甲胜,否则乙胜.保证球的编号xi各不相同.每轮比赛完了之后把取出的两球放 ...

  5. lightoj1104(数学概率与期望)

    题意: 增加一年有n天; 那么至少有几个人,能够保证至少两个人同一天生日的概率大于等于0.5; 思路: 转化一下题意; 就是求全部人生日都不同的概率小于等于0.5(那么至少两个人同一天就是大于等于0, ...

  6. hdu 4503(数学,概率)

    湫湫系列故事——植树节 Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  7. HDU_5810_数学,概率,方差

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5810 大意:将n个球往m个盒子中投,每个球被投入每个盒子的概率相等,求方差. 看题解说,这是二项分布( ...

  8. UVA 11971 - Polygon 数学概率

                                        Polygon  John has been given a segment of lenght N, however he n ...

  9. hdu 4159 Indomie (DP,数学概率)

    推出数学公式: #include<stdio.h> #include<string.h> __int64 C(int m,int n) { __int64 tmp=; if(m ...

随机推荐

  1. AQS总结

    前言 AQS(Abstract Queued Synchronizer)是JUC并发包中的核心基础组件,作者是大名鼎鼎的Doug Lea.通过AQS可以实现大部分的同步需求. 宏观架构 AQS包括一个 ...

  2. ConcurrentHashMap源码探究 (JDK 1.8)

    很早就知道在多线程环境中,HashMap不安全,应该使用ConcurrentHashMap等并发安全的容器代替,对于ConcurrentHashMap也有一定的了解,但是由于没有深入到源码层面,很多理 ...

  3. vector 循环里删除多个元素

    ; i < (int)vecLines.size(); i++) { AcDbLine * l1 = vecLines[i]; if (l1 == NULL) { continue; } //记 ...

  4. 教你如何使用css隐藏input的光标

    今天公司的ui突然跑过来问我一个问题:"如何在不影响操作的情况下,把input的光标隐藏了?". 我相信很多人会跟我一样,觉得这是个什么狗屁需求,输入框不要光标这不是反人类吗?可惜 ...

  5. safari坑之 video

    博客地址: https://www.seyana.life/post/19 本来是打算给博客左上角的gif做个优化, 把gif换成webm,以video的形式自动播放,能从180k降到50k, 现在浏 ...

  6. 还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!

    日常开发中,小黑哥经常需要用到 Java 提供集合类完成各种需求.Java 集合类虽然非常强大实用,但是提供功能还是有点薄弱. 举个例子,小黑哥最近接到一个需求,从输入一个文档中,统计一个关键词出现的 ...

  7. 【沫沫金】使用Serv-U FTP服务,搭建文件服务器

    内网文件服务器安装Serv-U FTP 链接: https://pan.baidu.com/s/1G51D1enLqZCUhnprnjAITw 提取码: snah Java Web工程,引入 comm ...

  8. 你知道吗,Flutter内置了10多种Button控件

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 Flutter内置了10多种Button(按钮)类控件供我 ...

  9. windows 安装 jenkins 自动化构建部署至linux服务器上

    一.环境准备 1.git安装环境 参考链接 https://www.cnblogs.com/yuarvin/p/12500038.html 2.maven安装环境,包括jdk环境安装 参考链接 htt ...

  10. Java 基础(四):数组

    数组,一种应用非常广泛的数据结构,简单地来说就是一组类型相同且无序的元素的存储在固定长度且有序的内存空间. 创建一个数组 在Java中,我们可以通过[]去声明一个指定类型的数组 int[] a; // ...