ZOJ 3329 One Person Game(概率dp)

来源:互联网 发布:pc蛋蛋算法 编辑:程序博客网 时间:2024/06/07 06:20

题意:有三个骰子,分别有k1,k2,k3个面。

每次掷骰子,如果三个面分别为a,b,c则分数置0,否则加上三个骰子的分数之和。
当分数大于n时结束。求游戏的期望步数。初始分数为0

题解:

转自:kuangbin

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>using namespace std;//typedef __int64 lld;#define oo 0x3f3f3f3f#define Mod 1000000007#define maxn 505double A[maxn],B[maxn];double p[maxn];int main(){    int n,k1,k2,k3,a,b,c,T;    scanf("%d",&T);    while(T--)    {        scanf("%d %d %d %d %d %d %d",&n,&k1,&k2,&k3,&a,&b,&c);        memset(p,0,sizeof p);        p[0]=1.0/k1/k2/k3;        for(int i=1;i<=k1;i++)            for(int j=1;j<=k2;j++)                for(int k=1;k<=k3;k++)                    if(i!=a||j!=b||k!=c)                        p[i+j+k]+=p[0];        memset(A,0,sizeof A);        memset(B,0,sizeof B);        for(int i=n;i>=0;--i)        {            A[i]=p[0];            B[i]=1.0;            for(int j=1;j<=k1+k2+k3;++j)            {                A[i]+=A[i+j]*p[j];                B[i]+=B[i+j]*p[j];            }        }        printf("%.15lf\n",B[0]/(1-A[0]));    }    return 0;}


0 0
原创粉丝点击