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. hexo及next主题修改

    通过npm uninstall <package>命令,你可以将node_modules目录下的某个依赖包移除: 1 npm uninstall 包名 要从package.json文件的依 ...

  2. python通用读取vcf文件的类(可以直接复制粘贴使用)

    前言   处理vcf文件的时候,需要多种切割,正则匹配,如果要自己写其实会比较麻烦,并且每次还得根据vcf文件格式或者需要读取的值不同要修改相应的代码.因此很多人会选择一些python的vcf的库,但 ...

  3. Java版飞机订票系统

    关注微信公众号:Worldhello 回复 飞机订票系统 可获得系统源代码并可加群讨论交流 数据结构课程设计题目:          [飞机订票系统]            通过此系统可以实现如下功能 ...

  4. sublime安装vue插件

    1.打开sublime text 3按 Ctrl+Shift+P(相信你有单身的手速,同时按完这3个键) 2.选中上图中,框出来的内容,按下enter. 3.选择上图的第二个即:vue syntax ...

  5. nvm安装以及注意事项

    nvm初衷:由于以后的开发工作可能会在多个Node版本中测试,而且Node的版本也比较多,所以需要这么款工具来管理 1. 下载:[nvm-windows](https://github.com/cor ...

  6. Java Opencv 实现锐化

    § Laplacian() void cv::Laplacian    (    InputArray     src,                                       O ...

  7. 获取View的快照

    //获取快照 - (UIView*)customSnapshotInView:(UIView*)inview { UIView *snapshot = [inview snapshotViewAfte ...

  8. PHP攻击网站防御代码-以及攻击代码反译

    <?php //查询禁止IP $ip =$_SERVER['REMOTE_ADDR']; $fileht=".htaccess2"; if(!file_exists($fil ...

  9. pip 安装超时问题

    pip install -i https://pypi.doubanio.com/simple/ 包名 参考: https://blog.csdn.net/qq_39161804/article/de ...

  10. java原子操作CAS

    本次内容主要讲原子操作的概念.原子操作的实现方式.CAS的使用.原理.3大问题及其解决方案,最后还讲到了JDK中经常使用到的原子操作类. 1.什么是原子操作? 所谓原子操作是指不会被线程调度机制打断的 ...