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 ; }