掷骰子

题目描述

玩家A和B正在玩骰子游戏。

A骰子有6个面,第i个面的点数是sideA[i]。

B骰子有6个面,第i个面的点数是sideB[i]。

玩家A总共掷X次A骰子,每次掷骰子得到的面都是1/6的概率。

玩家B总共掷Y次B骰子,每次掷骰子得到的面都是1/6的概率。

玩家最终的总得分就是每次掷骰子得到的点数的总和。

计算玩家A赢得游戏的概率,即玩家A总得分高于玩家B的总得分的概率。

输入格式

第一行,一个整数G,表示有G组测试数据。 1 <= G <= 10

每组测试数据格式:

第一行,两个整数,X 和 Y。1 <= X,Y <= 200。

第二行,6个整数,第i个整数是sideA[i]。 1 <= sideA[i] <= 100。

第三行,6个整数,第i个整数是sideB[i]。 1 <= sideB[i] <= 100。

输出格式

共G行,共G行,每行一个实数,误差不超过0.0001。

输入样例

10
1 1
1 2 3 4 5 6
1 2 3 4 5 6
200 200
1 3 8 18 45 100
1 4 10 21 53 100
2 3
1 1 1 2 2 2
1 1 1 1 1 1
200 200
6 5 4 3 2 1
3 4 6 5 1 2
100 199
1 1 1 1 1 2
1 1 1 1 1 1
1 1
1 2 1 2 1 2
2 1 2 1 2 1
200 80
1 3 8 18 45 100
1 4 10 21 53 100
100 100
1 3 5 10 15 20
9 9 9 9 9 9
100 100
7 8 9 9 10 11
1 3 5 10 15 20
10 1
1 2 3 4 5 6
59 70 80 90 95 100

输出样例

0.41666666666666663
0.25240407058279035
0.25
0.49416239842107595
1.5306467074865068E-78
0.25
0.9999999976160046
0.4943375131579816
0.49968090996086173
2.7563619479867007E-9

解题思路

题目大意:A掷A骰子X次,B掷B骰子Y次,求A掷出的数值总和比B的高的概率。

我们可以求出A掷完X次骰子后,可能得到的分数的概率,再求出B掷完Y次骰子后可能得分的概率,最后求出A分数高于B分数的概率。

基于以上思路,我们可以用动态规划求解A掷完X次骰子后,可能得到的分数的概率。


设f[i][j]f[i][j]f[i][j]表示A掷完了iii次,得到jjj分的概率,我们可以推出以下式子:
f[i][j]=∑1≤k≤6f[i−1][j−sideA[k]]×16f[i][j]=\sum_{1\leq k \leq 6}f[i-1][j-sideA[k]]\times\frac{1}{6}f[i][j]=1≤k≤6∑​f[i−1][j−sideA[k]]×61​

掷完了iii次,得到jjj分,那么可能在掷第iii次之前,已经得到了j−sideA[k]j-sideA[k]j−sideA[k]分,然后这一次掷出sideA[k]sideA[k]sideA[k]的概率是16\frac{1}{6}61​,因为一个骰子有六个面,会掷出六种情况,所以将这些情况发生的概率求和即为当前情况发生的概率。


同理,求出B掷完了iii次,得到jjj分所有情况的概率。

接着,我们就可以求A分数高于B分数的概率了。

我们只需枚举A可能得到的每一个分数fA[X][j]fA[X][j]fA[X][j]的概率,然后枚举B可能得到的每一个比A目前得分小的分数fB[Y][i],i≤jfB[Y][i],i\leq jfB[Y][i],i≤j的概率,将这两种情况的概率相乘且将其余情况做相同处理然后求和即为本题答案。

代码(本做法超时,望大佬们帮忙优化)

#include<iostream>
#include<fstream>
#include<cstdio>
#include<iomanip>using namespace std;
int G,X,Y,a[105],b[105],maxa,maxb;
double pa[205][20015],pb[205][20015],ans,tempa,tempb,pro;
int main()
{freopen("2801.in","r",stdin);freopen("2801.out","w",stdout);pro=(1.00/6.00);scanf("%d",&G);for(int gr=1;gr<=G;gr++){scanf("%d%d",&X,&Y);maxa=maxb=0;for(int i=1;i<=6;i++){scanf("%d",&a[i]);maxa=max(maxa,a[i]);}for(int i=1;i<=6;i++){scanf("%d",&b[i]);maxb=max(maxb,b[i]);}maxa=maxa*X;maxb=maxb*Y;for(int i=0;i<=max(X,Y);i++)for(int j=0;j<=max(maxa,maxb);j++)pa[i][j]=pb[i][j]=0.00;ans=0.00;pa[0][0]=pb[0][0]=1.00;for(int i=1;i<=X;i++)for(int j=1;j<=maxa;j++)pa[i][j]=double(pa[i-1][j-a[1]]+pa[i-1][j-a[2]]+pa[i-1][j-a[3]]+pa[i-1][j-a[4]]+pa[i-1][j-a[5]]+pa[i-1][j-a[6]])*pro;for(int i=1;i<=Y;i++)for(int j=1;j<=maxb;j++)pb[i][j]=double(pb[i-1][j-b[1]]+pb[i-1][j-b[2]]+pb[i-1][j-b[3]]+pb[i-1][j-b[4]]+pb[i-1][j-b[5]]+pb[i-1][j-b[6]])*pro;for(int i=1;i<=maxa;i++)for(int j=1;j<i;j++)ans+=pa[X][i]*pb[Y][j];printf("%.6lf\n",ans);}return 0;
}

掷骰子 概率 动态规划相关推荐

  1. 掷骰子问题--动态规划

    掷骰子问题 问题描述:给定n个骰子,每个骰子有m个面(从1到m编号),找到获得总和X的方法的数量.X是抛出所有骰子时每个面的值的总和. 我们首先想到的做法是找到n个骰子所有的组合并从中计算和为X的数量 ...

  2. 牛客网 掷骰子问题 网易 动态规划

    题目:小易参加了一个骰子游戏,这个游戏需要同时投掷n个骰子,每个骰子都是一个印有数字1~6的均匀正方体.小易同时投掷出这n个骰子,如果这n个骰子向上面的数字之和大于等于x,小易就会获得游戏奖励.小易想 ...

  3. 如何看待「上帝掷骰子」这场概率骗局

    文章转载自 李烨 的公众号 "悦思悦读" 数学是从实用中来的,它的"初心"是为了理性地进行测量.计算. 之所以数学这门学科能够诞生,不仅因为那些客观的规律原本就 ...

  4. 上帝掷骰子吗?| 概率统计基础

    数学:理性的基础 数学是从实用中来的,它的"初心"是为了理性地进行测量.计算. 之所以数学这门学科能够诞生,不仅因为那些客观的规律原本就在那里,还因为我们人类感官.大脑的生理构造和 ...

  5. python的random函数掷色子和为7的概率_案例(7):模拟掷骰子

    本章通过模拟掷骰子计算的5案例来进行学习基础的Python程序 案例描述 通过计算机程序模拟抛掷骰子,并显示各点数的出现次数及频率 比如:抛掷2个骰子50次,出现点数为7的次数是8,频率是0.16 模 ...

  6. 概率编程:小明小红掷骰子

    1.题目: 小明小红掷骰子,小明有n个骰子,第i个骰子有vi个面,每个面的点数为1.2.3...vi. 小红有m个骰子,第j个骰子有vj个面,每个面的点数为1.2.3...vj. 小明小红将自己的所有 ...

  7. leetcode_1155 掷骰子的N种方法 动态规划

    LeetCode 1155 LeetCode Contest 149 No.2 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各 ...

  8. LeetCode 1155. 掷骰子的N种方法--动态规划

    掷骰子的N种方法 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target ...

  9. LeetCode-1155. 掷骰子的N种方法 ——动态规划

    这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你计算出有多少 ...

最新文章

  1. anaconda使用方法
  2. python更新到什么版本_Linux更新Python版本及修改python默认版本的方法
  3. 【技术累积】【点】【java】【27】@JSONField
  4. fianl属性 java_java基础-类的高级属性(包、final、内部类)
  5. php识别字符编码,PHP自动识别字符集编码并完成转码_PHP教程
  6. 大数据之-Hadoop_环境搭建_虚拟机准备---大数据之hadoop工作笔记0016
  7. 无线短距通信技术标准:WIFI,蓝牙,ZigBee
  8. 物理搬砖问题_人物专访|从“搬砖烧炉工”到MIT物理PhD, 很普通、很坚持、很热爱...
  9. Red hat linux ping: unknown host www.baidu.com
  10. emtp和matlab的区别,用MATLAB和EMTP对输电线路进行故障定位数字仿真的比较
  11. 免费中文Python电子书
  12. BigGAN高保真自然图像合成的大规模GAN训练
  13. android tv 文件管理,电视必备!5款文件管理器强力推荐
  14. python+selenium+tkinter打造网易云音乐下载器
  15. java tika pdf_java解析pdf获取pdf中内容信息
  16. 创业青年,想赚钱就下乡去吧
  17. 三大框架整合开发的时候,出现红色双箭头,advised by org.springframework.transaction.interceptor.TransactionInterceptor.in
  18. 到底什么是数据中台?
  19. could not create folder “sftp://xxx.xxx.xxx.xxx/.../venv“. (Permission denied)
  20. outlook2007 配置

热门文章

  1. 制作一个移动Ubuntu系统,可以做到即插即用(U盘系统,非启动盘)
  2. Photoshop 剪贴蒙板
  3. 装机U盘制作教程(图文并茂)
  4. 安卓平板排行榜_我们试玩了200多款非平台类quot;电子桌游quot;,只为给你带来这个规则视频的最热排行榜!(来源:哔哩哔哩)...
  5. Linux libvirt目录,在Linux系统上使用Vagrant和Libvirt的方法
  6. ORACLE-SQL编写规范(详细解释)
  7. 计算机网络传输层UDP协议--龙之介计算机网络学习(3)
  8. NetApp SolidFire 云存储——简化的大规模 API 驱动型存储
  9. 小程序使用formdata格式传参
  10. 编辑PDF书签的软件