HDU 4405 Aeroplane chess

 

题意: 有 0到 n 个格子,掷骰子走路,求出到终点的数学期望,有飞行的路线。
分析: 求出用 dp[x] 表示走到 x 这个位置的数学期望假如 x 能到达 6 个格子x1,x2,..x6,那么dp[x]中x 格子的期望就是它到6个格子的概率
         分别乘以6个格子的期望,因为是从后往前推的,所以x1...x6的期望已经知道了 x 的期望也就能知道了,然后再 +1 因为要多走一步。
#include<stdio.h>
#include<string.h>
#define clr(x)memset(x,0,sizeof(x))
#define maxn 100005
struct node
{
    int to,next;
}e[100005];
int tot;
int head[maxn];
void add(int s,int t)
{
    e[tot].to=t;
    e[tot].next=head[s];
    head[s]=tot++;
}
double E[maxn];
int v[maxn];
int main()
{
    int n,m,i,j;
    while(scanf("%d%d",&n,&m),n||m)
    {
        tot=1;
        clr(head);
        while(m--)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            add(b,a);
        }
        clr(E);
        clr(v);
        E[n]=-1;
        for(i=n;i>=0;i--)
        {
            if(!v[i])
            {
                v[i]=1;
                E[i]+=1;
                for(j=1;j<=6;j++)
                    E[i]+=E[i+j]*(1.0/6.0);
            }
            for(j=head[i];j;j=e[j].next)
            {
                E[e[j].to]=E[i];
                v[e[j].to]=1;
            }
        }
        printf("%.4lf\n",E[0]);
    }
    return 0;
}

 

posted @ 2012-09-22 19:44  'wind  阅读(266)  评论(0编辑  收藏  举报