http://acm.hdu.edu.cn/showproblem.php?pid=4405

题意:飞行棋,可以跳,从0走到n,问期望步数

题解:dp[i]表示从i走到n的期望,逆推,因为每次都要走一步所以递推的时候每次加1

这类期望问题的一个大致讲解:

http://kicd.blog.163.com/blog/static/126961911200910168335852/

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std ;

double dp[100010] ;
int h[100010] ;

int main()
{
    int n,m ;
    while(~scanf("%d%d",&n,&m))
    {
        if(!n && !m)break ;
        memset(h,0,sizeof(h)) ;
        while(m--)
        {
            int x,y ;
            scanf("%d%d",&x,&y) ;
            h[x]=y ;
        }
        memset(dp,0,sizeof(dp)) ;
        for(int i=n-1 ;i>=0 ;i--)
        {
            if(h[i])dp[i]=dp[h[i]] ;
            else
            {
                for(int j=1 ;j<=6 ;j++)
                {
                    dp[i]+=dp[i+j] ;
                }
                dp[i]=dp[i]/6+1 ;
            }
        }
        printf("%.4f\n",dp[0]) ;
    }
    return 0 ;
}
View Code