HDU 4405 Aeroplane chess(期望)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4405

题意:从0走到n,每次走之前掷一次筛子,掷出几点就向前走几点,走到大于等于n的地方就停止。但是,有些地方可以连着走,即到达这个地方时可以接着到达以后的某个格子。问停止是掷骰子的期望?

思路:从后向前DP,f[i]表示从i开始到达停止状态的期望,x可以由i到达,f[i]+=(f[x]+1)/6...

 #include <iostream>

 #include <cstdio>

 #include <cstring>

 #define min(x,y) ((x)<(y)?(x):(y))

 using namespace std;

 

 int a[100005],n,m;

 double f[100005];

 

 int main()

 {

     while(scanf("%d%d",&n,&m),n||m)

     {

         memset(a,0,sizeof(a));

         int i,j,x,y;

         for(i=1;i<=m;i++)

         {

             scanf("%d%d",&x,&y);

             a[x]=y;

         }

         memset(f,0,sizeof(f));

         for(i=n-1;i>=0;i--)

         {

             if(a[i])

             {

                 f[i]=f[a[i]];

                 continue;

             }

             for(j=1;j<=6;j++)

             {

                 x=min(i+j,n);

                 f[i]+=(f[x]+1)/6;

             }

         }

         printf("%.4lf\n",f[0]);

     }

     return 0;

 }

  

 

 

 

 

 

你可能感兴趣的:(HDU)