转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove
题目:有3个筛子,分别有k1,k2,k3个面。每次掷筛子,如果三个面为指定的a,b,c,则分数置0,否则加上三个筛子的和。当总分大于等于n结束。求游戏的期望步数
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754
E[i]表示分数为i时的期望步数,当i>=n时,E[i]=0,题目要求的即是E[0]。
E[i]=sigma(E[i+k]*Pk)+E[0]*P0+1。其中Pk表示三个筛子和为k的概率,其中不包括指定的那种
其中P0就是指定的那种的概率。
可以发现这还是一个有环的期望问题,然后就是得迭代迭代然后化简了。。
E[0]为所求,而且每一个E[i]中都有E[0]。
令E[i]=a[i]*E[0]+b[i]。得到E[i]=(sigma(a[i+k]*pk)+P0)*E[0]+sigma(b[i+k]*pk)+1
便得到a[i]=sigma(a[i+k]*pk)+P0,b[i]=sigma(b[i+k]*pk)+1。
最终E[0]=b[0]/(1-a[0])
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 Die1, Die2 and Die3. Die1 hasK1 faces. Die2 has K2 faces. Die3 has K3 faces. All the dice are fair dice, so the probability of rolling each value, 1 to K1, K2, K3 is exactly 1 / K1, 1 / K2 and 1 / K3. You have a counter, and the game is played as follow:
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 n, K1, K2, K3, a, b, c (0 <= n <= 500, 1 < K1, K2, K3 <= 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
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; int n,x,y,z,a,b,c; double A[555],B[555]; double p[555]; int main() { int re; cin>>re; while(re--) { cin>>n>>x>>y>>z>>a>>b>>c; int cnt[55]; double pp=1.0/(1.0*x*y*z),p0=pp; memset(p,0,sizeof p); for(int i=1;i<=x;i++) for(int j=1;j<=y;j++) for(int k=1;k<=z;k++) if(i!=a||j!=b||k!=c) p[i+j+k]+=pp; double a[555],b[555]; memset(a,0,sizeof a); memset(b,0,sizeof b); memset(A,0,sizeof A); memset(B,0,sizeof B); for(int i=n;i>=0;i--) { for(int j=3;j<=x+y+z;j++) a[i]+=a[i+j]*p[j],b[i]+=b[i+j]*p[j]; a[i]+=p0; b[i]+=1; } double ans=b[0]/(1-a[0]); printf("%.15f\n",ans); } }