ZOJ Problem Set - 3329(概率DP)

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 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 K1, K2, K3 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 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

本题通过代换系数,化简后求系数。

一般形成环的用高斯消元法求解。但是此题都是和dp[0]相关。所有可以分离出系数。

dp[i]表示达到i还要掷几次的期望,每一项都和dp[0]有关,且可表示成dp[i]=A[i]*dp[0]+B[0];

所以只要求出dp[0]的系数A,B就可以求出dp[0]=B[0]/(1-A[0]);

dp[n] = dp[0]/k1/k1/k1+1;

然后递推可推出dp[0]的系数;

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define M(a,b) memset(a,b,sizeof(a))
 5
 6 using namespace std;
 7
 8 double A[1005],B[1005];
 9 int n,k1,k2,k3,a,b,c;
10
11 int main()
12 {
13     int t;
14     scanf("%d",&t);
15     while(t--)
16     {
17         M(A,0);
18         M(B,0);
19         scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c);
20         A[n] = 1.0/(k1*k2*k3);
21         B[n] = 1;
22         for(int i = n-1;i>=0;i--)
23         {
24             for(int p = 1;p<=k1;p++)
25                 for(int q = 1;q<=k2;q++)
26                    for(int r = 1;r<=k3;r++)
27             {
28                 if(p!=a||q!=b||r!=c)
29                    {
30                        A[i] += A[i+p+q+r]/(k1*k2*k3);
31                        B[i] += B[i+p+q+r]/(k1*k2*k3);
32                    }
33                    //cout<<A[i]<<‘ ‘<<B[i]<<endl;
34             }
35             A[i]+=(1.0/(k1*k2*k3));
36             B[i]+=1;
37             //cout<<A[i]<<‘ ‘<<B[i]<<endl;
38         }
39         double ans = B[0]/(1-A[0]);
40         printf("%.16f\n",ans);
41     }
42     return 0;
43 }
时间: 2024-08-08 17:51:38

ZOJ Problem Set - 3329(概率DP)的相关文章

ZOJ 3551 Bloodsucker (概率DP)

ZOJ Problem Set - 3551 Bloodsucker Time Limit: 2 Seconds      Memory Limit: 65536 KB In 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them meet. Nothing will happen if they are of the same species, that is, a people

zoj 3822 Domination 【概率DP 求期望】

Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with his friends. What's more, he bought a large decorative chessboar

ZOJ 3551 Bloodsucker(概率dp啊 )

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4530 Bloodsucker Time Limit: 2 Seconds      Memory Limit: 65536 KB In 0th day, there are n-1 people and 1 bloodsucker. Every day, two and only two of them meet. Nothing will happen if th

zoj 3329 概率dp

看了这么多,也就是个递推 1 /* 2 ZOJ 3329 3 题意:有三个骰子,分别有k1,k2,k3个面. 4 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 5 当分数大于n时结束.求游戏的期望步数.初始分数为0 6 7 设dp[i]表示达到i分时到达目标状态的期望,pk为投掷k分的概率,p0为回到0的概率 8 则dp[i]=∑(pk*dp[i+k])+dp[0]*p0+1; 9 都和dp[0]有关系,而且dp[0]就是我们所求,为常数 10 设dp[i]=A

zoj 3329 概率dp 环

一个游戏,你手上有三个骰子,分别有k1, k2, k3面.每次投出这三个骰子,得到三个面x, y, z.并且你有一个计数器,如果投出a, b, c, 则计数器归零,否则计数器加上三面之和,计数器初始为零.如果计数器的值大于 n 则游戏胜利.求胜利所需投骰子次数的期望. 以计数器的值为状态,dp[i] 表述计数器的值为i的情况下投骰子的期望.得到转移方程 p[k] 表示投出点数总和为k的概率,k=0时表示投出计数器归零的概率. dp[i] = p[0]*dp[0] + Σ(dp[i+k]*p[k]

ZOJ 3822 Domination (三维概率DP)

E - Domination Time Limit:8000MS     Memory Limit:131072KB     64bit IO Format:%lld & %llu Submit Status Description Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with his friends. What's more, he

ZOJ 3822 Domination (概率DP)

Domination Time Limit: 8 Seconds      Memory Limit: 131072 KB      Special Judge Edward is the headmaster of Marjar University. He is enthusiastic about chess and often plays chess with his friends. What's more, he bought a large decorative chessboar

Code Jam 2008 APAC local onsites Problem C. Millionaire —— 概率DP

题意: 你有X元钱,进行M轮赌博游戏.每一轮可以将所持的任意一部分钱作为赌注(赌注为0元表示这一轮不押),赌注可以是小数的,不是一定要整数.每一轮 赢的概率为P,赢了赌注翻倍,输了赌注就没了.如果你最后持有至少1000000元钱的话,就可以把钱全部带走.要求计算在采取最优策略时,获得至少 1000000元钱的概率. 数据范围: 0<=P<=1 1<=X<=1000000 1<=M<=15 1 int M , X ; 2 double P; 3 double dp[2][

ZOJ Problem Set - 3329 One Person Game

题目大意:有三个骰子,分别有k1,k2,k3个面. 每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和. 当分数大于n时结束.求游戏的期望步数.初始分数为0分析  设 E[i]表示现在分数为i,到结束游戏所要掷骰子的次数的期望值.  显然 E[>n] = 0; E[0]即为所求答案;  E[i] = ∑Pk*E[i+k] + P0*E[0] + 1; (Pk表示点数和为k的概率,P0表示分数清零的概率)   由上式发现每个 E[i]都包含 E[0],而 E[0]又是我们