题意:一个长为n+1的格子,初始位置在0,记为i,每掷一次骰子得到一个数j,位置移动到i+j,当位置(i+j)>=n时游戏结束,问掷骰子次数的数学期望。
a[i] 表示从位置 i 到游戏结束的次数的期望,因为有飞机~~, fly[i]=j,表示 i 飞到 j 。
a[n]=0,然后倒着计算,最后答案是a[0].
#include<stdio.h> #include<string.h> #define maxn 100010 double a[maxn]; int fly[maxn]; int main() { int n,m; int x,y; while(scanf("%d%d",&n,&m) && (n+m)) { memset(fly,-1,sizeof(fly)); memset(a,0,sizeof(a)); for(int i=0;i<m;i++) { scanf("%d%d",&x,&y); fly[x]=y; } for(int i=n-1;i>=0;i--) { if(fly[i]!=-1) a[i]=a[fly[i]]; else { for(int j=1;j<=6;j++) if((i+j)>=n) a[i]+=(1.0/6)*a[n]; else a[i]+=(1.0/6)*a[i+j]; a[i]+=1.0; } } printf("%.4lf ",a[0]); } return 0; }