One Person Game


Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge


There is a very simple and interesting one-person game. You have 3 dice, namely Die1Die2 and Die3Die1 has K1 faces. Die2 has K2 faces. Die3 has K3 faces.
All the dice are fair dice, so the probability of rolling each value, 1 to K1K2K3 is exactly 1 / K1, 1 / K2 and 1 / K3. You have a counter,
and the game is played as follow:

  1. Set the counter to 0 at first.
  2. Roll the 3 dice simultaneously. If the up-facing number of Die1 is a, the up-facing number of Die2 is b and the up-facing number of Die3 is c, set the counter to 0. Otherwise,
    add the counter by the total value of the 3 up-facing numbers.
  3. If the counter's number is still not greater than n, go to step 2. Otherwise the game is ended.

Calculate the expectation of the number of times that you cast dice before the end of the game.

Input

There are multiple test cases. The first line of input is an integer T (0 < T <= 300) indicating the number of test cases. Then T test cases follow. Each test
case is a line contains 7 non-negative integers nK1K2K3abc (0 <= n <= 500, 1 < K1K2K3 <=
6, 1 <= a <= K1, 1 <= b <= K2, 1 <= c <= K3).

Output

For each test case, output the answer in a single line. A relative error of 1e-8 will be accepted.

Sample Input

2
0 2 2 2 1 1 1
0 6 6 6 1 1 1

Sample Output

1.142857142857143
1.004651162790698

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754

/*题意:
有三个骰子,分别有k1,k2,k3个面。
每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。
当分数大于n时结束。求游戏的期望步数。初始分数为0 分析:
如果dp[i]表示拥有分数i到游戏结束的期望步数

(1):dp[i]=SUM(p[k]*dp[i+k])+p[0]*dp[0]+1;//p[k]表示添加分数为k的概率,p[0]表示分数变为0的概率
假定
(2):dp[i]=A[i]*dp[0]+B[i];

(3):dp[i+k]=A[i+k]*dp[0]+B[i+k];
将(3)代入(1)得:
(4):dp[i]=(SUM(p[k]*A[i+k])+p[0])*dp[0]+SUM(p[k]*B[i+k])+1;
将4与2做比較得:
A[i]=(SUM(p[k]*A[i+k])+p[0]);
B[i]=SUM(p[k]*B[i+k])+1;
当i+k>n时A[i+k]=B[i+k]=0可知
所以dp[0]=B[0]/(1-A[0])可求出
*************************************************************************
总结下这类概率DP:
既DP[i]可能由DP[i+k]和DP[i+j]须要求的比方DP[0]决定
相当于概率一直递推下去会回到原点
比方
(1):DP[i]=a*DP[i+k]+b*DP[0]+d*DP[i+j]+c;
可是DP[i+k]和DP[0]都是未知
这时候依据DP[i]的方程式如果一个方程式:
比方:
(2):DP[i]=A[i]*DP[i+k]+B[i]*DP[0]+C[i];
由于要求DP[0],所以当i=0的时候可是A[0],B[0],C[0]未知
对照(1)和(2)的区别
这时候对照(1)和(2)发现两者之间的区别在于DP[i+j]
所以依据(2)求DP[i+j]然后代入(1)消除然后对照(2)就能够得到A[i],B[i],C[i]
然后视详细情况依据A[i],B[i],C[i]求得A[0],B[0],C[0]继而求DP[0]
请看这题:http://acm.hdu.edu.cn/showproblem.php?pid=4035
*************************************************************************
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std; const int MAX=500+10;
int n,k1,k2,k3,a,b,c;
double p[20],A[MAX+10],B[MAX+10]; void dfs(int i){//求A[i],B[i]
if(A[i]>0)return;
if(i>n){A[i]=B[i]=0;return;}
A[i]=p[0],B[i]=1;
for(int k=3;k<=k1+k2+k3;++k){
dfs(i+k);
A[i]+=p[k]*A[i+k];
B[i]+=p[k]*B[i+k];
}
} int main(){
int t;
scanf("%d",&t);
while(t--){
memset(p,0,sizeof p);
scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c);
p[0]=1.0/(k1*k2*k3);
for(int i=1;i<=k1;++i){
for(int j=1;j<=k2;++j){
for(int k=1;k<=k3;++k){
p[i+j+k]+=p[0];//求i+j+k的概率
}
}
}
p[a+b+c]-=p[0];//a+b+c的分数不能等于a,b,c,所以须要减去
memset(A,0,sizeof A);
memset(B,0,sizeof B);
dfs(0);
/*memset(A,0,sizeof A);
memset(B,0,sizeof B);
for(int i=n;i>=0;--i){
A[i]=p[0],B[i]=1;
for(int k=3;k<=k1+k2+k3;++k){
A[i]+=p[k]*A[i+k];
B[i]+=p[k]*B[i+k];
}
}*/
printf("%.15f\n",B[0]/(1-A[0]));
}
return 0;
}

ZOJ3329之经典概率DP的更多相关文章

  1. ZOJ 3329 One Person Game (经典概率dp+有环方程求解)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 题意:现在有三个骰子,分别有k1,k2和k3面,面上的点就是1~ki ...

  2. poj 2096 Collecting Bugs 概率dp 入门经典 难度:1

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 2745   Accepted: 1345 ...

  3. 动态规划之经典数学期望和概率DP

    起因:在一场训练赛上.有这么一题没做出来. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6829 题目大意:有三个人,他们分别有\(X,Y,Z\)块钱 ...

  4. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

  5. 2018.09.27 bzoj3029: 守卫者的挑战(概率dp)

    传送门 概率dp经典题目. 直接f[i][j][k]f[i][j][k]f[i][j][k]表示当前是第i次挑战,已经胜利了j次,目前的背包剩余空间是k. 然后用前面的转移后面的就行了. 注意第三维可 ...

  6. 2018.09.24 bzoj1867: [Noi1999]钉子和小球(概率dp)

    传送门 概率dp经典题. 如果当前位置(i,j)(i,j)(i,j)有钉子,那么掉到(i+1,j),(i+1,j+1)(i+1,j),(i+1,j+1)(i+1,j),(i+1,j+1)的概率都是1/ ...

  7. 【整理】简单的数学期望和概率DP

    数学期望 P=Σ每一种状态*对应的概率. 因为不可能枚举完所有的状态,有时也不可能枚举完,比如抛硬币,有可能一直是正面,etc.在没有接触数学期望时看到数学期望的题可能会觉得很阔怕(因为我高中就是这么 ...

  8. 概率dp集合

    bzoj1076 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后 ...

  9. DP专题之概率DP

    注意:在概率DP中求期望要逆着推,求概率要正着推 概率DP求期望: 链接: http://acm.hdu.edu.cn/showproblem.php?pid=4405 dp[ i ]表示从i点走到n ...

随机推荐

  1. DX笔记之一---Direct3D基础

    一.预备知识 1.表面 表面就是Direct3D用于储存2D图像数据的一个像素矩阵.width和height以像素为单位,pitch以字节单位,用接口IDirect3DSurface来描述表面 Loc ...

  2. SGU 160.Magic Multiplying Machine

    时间限制:0.5s 空间限制6M 题意:        给出n个(1<=n<=10000)1~m(2<m<1000)范围内的数,选择其中任意个数,使它们的 乘积 模m 最大,输 ...

  3. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  4. mysql更新密码为空

    1.进入命令行 mysql -u root -p 'oldpassword'; 2 修改root用户的密码:mysql> update mysql.user set password=PASSW ...

  5. 原生javascript写的侧栏跟随效果

    浏览网站时经常看到有的网站上,当一个页面很长的时候,设定侧栏内容会跟随滚动条滚动,我们把这种效果叫做“侧栏跟随滚动”.这种特效对提高网站浏览量.文章点击率.广告点击量都有一定效果. 侧栏跟随滚动的实现 ...

  6. linux根目录下各文件的作用

    各文件详列:   /bin 存放常用命令的目录(二进制可执行命令)    /dev 设备特殊文件    /etc 存放配置相关的文件(系统管理和配置文件)    /etc/rc.d 启动的配置文件和脚 ...

  7. python类class基础

              44.class类:                      一.类定义的一般形式:                            1.简单的形式:实例化对象没有自己独有 ...

  8. 尽量使用ToUpper比较,避免使用ToLower

    在编码时尽量使用ToUpper比较,避免使用ToLower,因为微软对ToUpper进行了优化,以下为测试结果: public void TestToLower() { Stopwatch watch ...

  9. bzoj1233: [Usaco2009Open]干草堆tower

    Description 奶牛们讨厌黑暗. 为了调整牛棚顶的电灯的亮度,Bessie必须建一座干草堆使得她能够爬上去够到灯泡 .一共有N大包的干草(1<=N<=100000)(从1到N编号) ...

  10. 2、MyBatis.NET学习笔记之CodeSmith使用

    说明:本系列随笔会与CSDN同步发布,当然这里先发,因为这里可以用WLW.但刚才由于误操作,没有重新发上来.只好先在CSDN先发了.重往这里发时图片无法处理,索性直接粘过来吧! 使用框架后一些相关的配 ...