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]又是我们要求的,是个定值。

 设 E[i] = a[i]*E[0] + b[i];

 将其带入上面的式子:  E[i] = ( ∑Pk*a[i+k] + P0 )*E[0] + ∑Pk*b[i+k] + 1;
 显然, 

   a[i] = ∑Pk*a[i+k] + P0; 

   b[i] = ∑Pk*b[i+k] + 1; 

  当 i > n 时: 

  E[i] = a[i]*E[0] + b[i] = 0; 

 所以 a[i>n] = b[i>n] = 0;   可依次算出 a[n],b[n]; a[n-1],b[n-1] ... a[0],b[0];  则 E[0] = b[0]/(1 - a[0]); 


 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 int main()
 6 {
 7     int t,n,k1,k2,k3,a,b,c;
 8     scanf("%d",&t);
 9     while(t--)
10     {
11         scanf("%d %d %d %d %d %d %d",&n,&k1,&k2,&k3,&a,&b,&c);
12         int sum=k1+k2+k3;
13         double pp=1.0/(k1*k2*k3);
14         double p[10000];
15         memset(p,0,sizeof(p));
16         for(int i=1; i<=k1; i++)
17         {
18             for(int j=1; j<=k2; j++)
19             {
20                 for(int k=1; k<=k3; k++)
21                     if(i!=a||j!=b||k!=c)
22                         p[i+j+k]+=pp;
23             }
24
25         }
26         double a[1000]= {0},b[1000]= {0};
27         for(int i=n; i>=0; i--)
28         {
29             for(int k=3; k<=sum; k++)
30             {
31                 a[i]+=a[i+k]*p[k];
32                 b[i]+=b[i+k]*p[k];
33             }
34             a[i]+=pp;
35             b[i]+=1;
36         }
37         printf("%.15lf\n",b[0]/(1-a[0]));
38     }
39     return 0;
40 }

 
时间: 2024-10-11 10:10:27

ZOJ Problem Set - 3329 One Person Game的相关文章

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

ZOJ Problem Set - 3820 Building Fire Stations 【树的直径 + 操作 】

题目:problemId=5374" target="_blank">ZOJ Problem Set - 3820 Building Fire Stations 题意:给出n个点,n-1条边的一棵树.然后要在两个点上建立两个消防站.让全部点的到消防站最大距离的点的这个距离最小. 分析:首先先求这个树的直径.然后在树的直径的中点处把树分成两棵树.然后在把两棵树分别取中点的最大值就是ans值. 这个题目数据有点水了感觉... AC代码: #include <cstdi

ZOJ Problem Set - 1025解题报告

ZOJ Problem Set - 1025 题目分类:动态规划 原题地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1025   题目大意就是有很多木头,都有各自的长度和重量.现在要加工这些木头,如果加工某根木头的长度和重量大于等于它上一根木头的长度和重量,那么加工它不需要时 间,否则要花1分钟.现给出一堆木头的长度和重量,要求加工完这堆木头可以花的最少时间.例如给出5根木头长度重量分别为(4,9), (5,2),

ZOJ Problem Set - 3321 并查集

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3321 Circle Time Limit: 1 Second      Memory Limit: 32768 KB Your task is so easy. I will give you an undirected graph, and you just need to tell me whether the graph is just a circle.

ZOJ Problem Set - 3804 YY&#39;s Minions

学习:换一个角度考虑问题.YY's Minions Time Limit: 2 Seconds      Memory Limit: 65536 KB Despite YY's so much homework, she would like to take some time to play with her minions first. YY lines her minions up to an N*M matrix. Every minion has two statuses: awake

ZOJ Problem Set - 3195 Design the city 【Tarjan离线LCA】

题目:ZOJ Problem Set - 3195 Design the city 题意:给出一个图,求三点的连起来的距离. 分析:分别求出三点中任意两点的距离 / 2  = ans AC代码: #include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; #define N 50010 #define M 20010 struc

ZOJ Problem Set - 3229 Shoot the Bullet 【有上下界网络流+流量输出】

题目:ZOJ Problem Set - 3229 Shoot the Bullet 分类:有源有汇有上下界网络流 题意:有 n 天和 m 个girls,然后每天给一部分girls拍照,每个girls 有拍照的下限,即最少要拍这么多张,然后每天有k个女孩拍照,摄影师最多可以拍num张,然后 k 个女该每天拍照数量值有上下限,然后问你有没有满足这样条件的给女孩拍照的最大方案,然后按照输入输出每天给女孩拍照的张数. 做这道题目推荐先做:这儿 分析:首先它让你判断能不能满足条件. 按照题目给出的条件很

ZOJ Problem Set - 3203 Light Bulb 【三分法】

题目:ZOJ Problem Set - 3203 Light Bulb 题意: 如图,有个人在地上走,然后他的影子可以投影到墙上或者地上,问影子最长是多少? 分析: 我们知道,三分法是解决一个凹或凸函数的极大极小值,发现这个影子从刚好投影到右下角开始便是一个凸函数,他的影子长度是先递增后递减的,所以可以用三分法. 三分法的原理: AC代码: #include <cstdio> #include <cstring> #include <vector> #include

ZOJ Problem Set - 2563 Long Dominoes 【状压dp】

题目:ZOJ Problem Set - 2563 Long Dominoes 题意:给出1*3的小矩形,求覆盖m*n的矩阵的最多的不同的方法数? 分析:有一道题目是1 * 2的,比较火,链接:这里 这个差不多,就是当前行的状态对上一行有影响,对上上一行也有影响.所以 定义状态:dp[i][now][up]表示在第 i 行状态为now ,上一行状态为 up 时的方案数. 然后转移方程:dp[i][now][up] = sum ( dp[i-1][up][uup] ) 前提是合法 合法性的判断是比