同3853:http://www.cnblogs.com/xiao-xin/articles/4307653.html
dp[i]=sum(dp[j])+1,从后向前递推,注意’滑翔‘的点
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 //当前状态到最终状态期望多少步?只需要知道当前状态的下一个状态到目标状态期望*到这个状态概率->之和,然后加上一步行动,即为该状态期望 6 double dp[100010]; 7 int next[100010]; 8 int main() 9 { 10 int n,m,i,j,x,y; 11 while (~scanf("%d%d",&n,&m)&&n) 12 { 13 memset(next,-1,sizeof(next)); 14 for (i=1;i<=m;i++) 15 { 16 scanf("%d%d",&x,&y); 17 next[x]=y; 18 } 19 memset(dp,0,sizeof(dp)); 20 for (i=n-1;i>=0;i--) 21 { 22 if (next[i]!=-1) dp[i]=dp[next[i]]; 23 else{ 24 for (j=1;j<=6;j++) dp[i]+=dp[i+j]; 25 dp[i]=dp[i]/6+1; 26 } 27 } 28 printf("%.4lf\n",dp[0]); 29 } 30 return 0; 31 }