ZOJ 3329 One Person Game

转载请注明出处,谢谢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 Die1Die2 and Die3Die1 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 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
#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);
    }
}


你可能感兴趣的:(ZOJ 3329 One Person Game)