ZOJ 3329 One Person Game(期望)

来源:互联网 发布:软件实施工程师招聘 编辑:程序博客网 时间:2024/06/03 20:44

题目链接:ZOJ 3329 One Person Game

(from ACM_cxlove)

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])+P0)*E[0]+sigma(b[i+k])+1
便得到a[i]=sigma(a[i+k])+P0,b[i]=sigma(b[i+k])+1。
最终E[0]=b[0]/(1-a[0])

开始xa,xb没置0,一直WA。

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAX_N = 500 + 50;double _map[3 * 6 + 5], xa[MAX_N], xb[MAX_N];int main(){    //freopen("in.txt", "r", stdin);    int T;    scanf("%d", &T);    while(T--)    {        memset(_map, 0, sizeof(_map));        memset(xa, 0, sizeof(xa));        memset(xb, 0, sizeof(xb));        int n, a, b, c, k1, k2, k3;        scanf("%d%d%d%d%d%d%d", &n, &k1, &k2, &k3, &a, &b, &c);        int k = k1 * k2 * k3;        double p = 1.0 / k;        for(int i = 1; i <= k1; i++)            for(int j = 1; j <= k2; j++)                for(int m = 1; m <= k3; m++)                    if(!(i == a && j == b && m == c))                        _map[i + j + m] += p;        for(int i = n; i >= 0; i--)        {            xa[i] = p, xb[i] = 1;            for(int j = 3; j <= k1 + k2 + k3; j++)            {                xa[i] += xa[i + j] * _map[j];                xb[i] += xb[i + j] * _map[j];            }        }        printf("%.16lf\n", xb[0] / (1 - xa[0]));    }    return 0;}


0 0