手机版 | 登陆 | 注册 | 留言 | 设首页 | 加收藏
当前位置: 网站首页 > 热点摘要 > 文章 当前位置: 热点摘要 > 文章

赌博游戏 概率dp

时间:2019-11-11    点击: 次    来源:赌博游戏 概率dp    作者:赌博游戏 概率dp - 小 + 大

赌博游戏 概率dp

                                                                 

题目描述
最近西雅图的高中校园里流行这样一个游戏。

我们有一个骰子,这个骰子有 M 个面,分别写着 1..M ,并且是个公平的骰子,换句话说,一次投掷时每个面朝上的概率是相同的。

游戏的组织者使用这个骰子进行 N 次投掷,并且告诉玩家点数 v 出现了至少一次。那么玩家需要猜测 N 次投掷的点数之和。如果猜对了,就赢得了这个游戏。

小宇也喜欢玩这个游戏。在一次游戏中,她猜测了一个正整数 sum ,于是她想知道猜对的概率是多少。

输入格式
输入文件仅一行,包括 4 个正整数 N, M, v, sum 。

输出格式
输出文件包括一行,一个实数,保留 8 位小数,表示猜对的概率。

样例数据 1
输入 
2 6 6 12
输出
0.09090909

分析:定义f[i][j][k],表示猜了i次,和为j,是否猜到过v,于是不难看出转移:
f[i][j][k==v]+=f[i-1][j-k][0]/(m*1.0);
f[i][j][1]+=f[i-1][j-k][1]/(m*1.0);
最后统计和为sum的概率/总的和的概率就得到答案:

# include <iostream> # include <cstdio> # include <cmath> # include <list> # include <cstring> # include <map> # include <ctime> # include <algorithm> # include <queue> using namespace std; typedef long long ll; int read(){ int f=1,i=0;char ch=getchar(); while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();} while(ch>='0'&&ch<='9') {i=(i<<3)+(i<<1)+ch-'0';ch=getchar();} return f*i;} double tot,f[55][2550][2]; int n,m,v,sum; int main(){    n=read(),m=read(),v=read(),sum=read();    f[0][0][0]=1; for(int i=1;i<=n;++i) for(int j=1;j<=n*m;++j) for(int k=1;k<=min(j,m);++k)            {                f[i][j][k==v]+=f[i-1][j-k][0]/(m*1.0);                f[i][j][1]+=f[i-1][j-k][1]/(m*1.0);            } for(int i=1;i<=n*m;++i) tot+=f[n][i][1]; printf("%.8f\n",f[n][sum][1]/tot);}		
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
      下载地址

上一篇:悲剧!澳大利亚拳王在拳击比赛中不幸身亡

下一篇:【揭秘】月薪4000保安小伙,却坐拥百万豪宅!

 别浪费都给你吧懒得弄电脑来到宁波懒得弄便利店内懒得弄 哪来的呢懒得弄老地方能力的看法卡积分换员不是卡八VB不不大好说是 时空金币是那伤口局部深V不睡觉 100是开放道具卡类风湿VB你没收到是是你
备案5589485-ICP编号  |   QQ:微信:SL49568  |  地址:北京市东城区  |  电话:186-5901-6237  |