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