码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ 3329 - One Person Game

时间:2014-05-23 11:48:09      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:style   class   blog   c   code   tar   

题意:每次筛三个骰子面分别为k1,k2,k3,如果三个骰子的值分别为a,b,c则得分置0,否则得到分数加上三个骰子的值的和,如果得分大于等于n则结束游戏。

 

设E[i]表示当前得到i分时结束游戏的期望。

则E[i]=sum{Pk*(E[i+k]+1)|k为三个骰子可能取得的分数且不包括a,b,c这种情况}+1/(k1*k2*k3)(E[0]+1)

        =sum{Pk*(E[i+k])}+1/(k1*k2*k3)*E[0]+1

这里出现了一个问题,之前的方程都是只与一个方向的有关,而这里E[i]与E[0]和E[i+k]有关, E[0]是E[i]的先前结点,而E[i+k]是E[i]的后置结点,因此无法使用DP解决这个问题。我们考虑消去一个变量,这里只有最后的结点E[n]是已知的,所以我们可以消去后置结点E[i+k]。这样假设E[i]=A[i]*E[0]+B[i],代入E[i+k],可得E[i]=sum{Pk*(A[i+k]*E[0]+B[i+k])}+1/(k1*k2*k3)*E[0]+1,进一步得E[i]=(sum{Pk*A[i+k]}+1/(k1*k2*k3))*E[0]+sum{Pk}*B[i+k]+1。

这样对应系数可得到A[i]=sum{Pk*A[i+k]}+1/(k1*k2*k3),B[i]=sum{Pk}*B[i+k]+1。

我们知道E[n]=0,所以A[n]=0,B[n]=0。

这样可以递推求出所有A[i]和B[i],这样也就能算出所有的E[i]了。

最终答案是E[0]。E[0]=A[0]*E[0]+B[0],所以E[0]=B[0]/(1-A[0])。

 

bubuko.com,布布扣
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#define ll long long
#define MAXN 30005
using namespace std;
double A[525],B[525];
double pro[30];
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,k1,k2,k3,a,b,c;
        scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c);
        double r=1.0/(k1*k2*k3);
        memset(A,0,sizeof(A));
        memset(B,0,sizeof(B));
        memset(pro,0,sizeof(pro));
        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))
                        pro[i+j+k]+=r;
        int s=k1+k2+k3;
        for(int i=n; i>=0; --i)
        {
            for(int j=3; j<=s; ++j)
            {
                A[i]+=pro[j]*A[i+j];
                B[i]+=pro[j]*B[i+j];
            }
            A[i]+=r;
            B[i]++;
        }
        printf("%.8f\n",B[0]/(1-A[0]));
    }
    return 0;
}
View Code

 

ZOJ 3329 - One Person Game,布布扣,bubuko.com

ZOJ 3329 - One Person Game

标签:style   class   blog   c   code   tar   

原文地址:http://www.cnblogs.com/kkkwjx/p/3737346.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!