ZOJ 3329 期望DP

题目大意:

给定3个已经规定好k1,k2,k3面的3个色子,如果扔到a,b,c则重新开始从1 计数,否则不断叠加所有面的数字之和,直到超过n,输出丢的次数的数学期望

我们在此令dp[]数组记录从当前数值到结束的数学期望

假如有3个面数都为2的色子

那么dp[i] = 1.0 / 2/2/2 * dp[0] + 1.0/8*dp[i+3] +3.0/8*dp[i+4]+3.0/8*dp[i+5]+1.0/8*dp[i+6] + 1

当然那些下标大于i的dp值均为0

可是我们这样从后往前推会导致无法计算dp[0]的数值,没法推

从新寻找规律,可以看做

dp[i] = a[i] * dp[0] + b[i]; 1式

dp[i] = p0 * dp[0] + ∑(dp[i+k]*p[k]) + 1; 2式

1式代人2式

dp[i] = p0*dp[0] + ∑((a[i+k]*dp[0]+b[i+k]))*p[k])+1

dp[i] =( p0+∑(a[i+k]*p[k])) dp[0] + ∑(b[i+k]*p[k]) +1

所以a[i] =p0+∑(a[i+k]*p[k])      b[i] = ∑(b[i+k]*p[k]) +1

这样我们由后往前推不断得到所有的a[i]和b[i]值

dp[0] = a[0]*dp[0]+b[0]

这样我们得到a[0],b[0]就很容易得到dp[0]的值了

这是这段叠加处求a,b数组的代码

memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        for(int i=n;i>=0;i--){
            for(int j=3;j<=maxn;j++)
            {
                a[i]+=a[i+j] * pro[j];
                b[i]+=b[i+j] * pro[j];
            }
            a[i]+=1.0/k1/k2/k3;
            b[i]+=1;
        }

 1 #include <cstdio>
 2 #include <cstring>
 3
 4 using namespace std;
 5 double pro[20],a[600],b[600];
 6
 7 int main()
 8 {
 9     int n,k1,k2,k3,d,e,f,T;
10     scanf("%d",&T);
11     while(T--){
12         scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&d,&e,&f);
13
14         int maxn = k1+k2+k3;
15         memset(pro,0,sizeof(pro));
16         for(int i=1;i<=k1;i++){
17             for(int j=1;j<=k2;j++){
18                 for(int k=1;k<=k3;k++)
19                     if(i!=d||j!=e||k!=f)
20                         pro[i+j+k]++;
21             }
22         }
23
24         for(int i=3;i<=maxn;i++)
25             pro[i] = pro[i]*1.0/k1/k2/k3;
26
27         memset(a,0,sizeof(a));
28         memset(b,0,sizeof(b));
29         for(int i=n;i>=0;i--){
30             for(int j=3;j<=maxn;j++)
31             {
32                 a[i]+=a[i+j] * pro[j];
33                 b[i]+=b[i+j] * pro[j];
34             }
35             a[i]+=1.0/k1/k2/k3;
36             b[i]+=1;
37         }
38
39         double ans = b[0] / (1-a[0]);
40         printf("%.10f\n",ans);
41     }
42 }
时间: 2024-08-09 01:19:26

ZOJ 3329 期望DP的相关文章

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]

[ACM] ZOJ 3329 One Person Game (概率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 3299 概率dp

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3329 回头重推式子 题解:http://blog.csdn.net/morgan_xww/article/details/6775853#reply 学到: 1.目前做的两道期望的状态转移方程都是从大向小推,定义方式:dp[i][j][k]....  满足i,j,k时,要达到upbound(i),upbound(j),upbound(k),需要XX的期望 2.待定系数的方

zoj 3640 概率dp

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4808 Background     If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth at the door. And unto thee shall be his desire, and thou shalt rule over him. And Cai

【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于是想到了这样的一个

HDOJ 1145 So you want to be a 2n-aire? 期望DP

期望DP So you want to be a 2n-aire? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 267    Accepted Submission(s): 197 Problem Description The player starts with a prize of $1, and is asked a seq

HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由于得到每张卡片的状态不知道,所以用状态压缩,dp[i] 表示这个状态时,要全部收齐卡片的期望. 由于有可能是什么也没有,所以我们要特殊判断一下.然后就和剩下的就简单了. 另一个方法就是状态压缩+容斥,同样每个状态表示收集的状态,由于每张卡都是独立,所以,每个卡片的期望就是1.0/p,然后要做的就是要去重,既然

Topcoder SRM656div1 250 ( 期望DP )

Problem Statement    Charlie has N pancakes. He wants to serve some of them for breakfast. We will number the pancakes 0 through N-1. For each i, pancake i has width i+1 and deliciousness d[i].Charlie chooses the pancakes he is going to serve using t