HDU4405
Hzz非常喜欢飞机象棋。象棋地图包含N+1个从0到N的网格。Hzz从网格0开始。他每走一步就掷一个骰子(一个骰子有六个面,面朝上的概率相等,面上的数字是1、2、3、4、5、6)。当Hzz在第一格且骰子数为x时,他将移动到第一格+x。当i+x等于或大于N时,Hzz结束游戏。
国际象棋地图上还有M条航线。第i条飞行线可以帮助Hzz从网格Xi飞到Yi(0<Xi<Yi<=N),而无需掷骰子。如果有另一条来自易的航线,Hzz可以连续乘坐该航线。允许没有两条或两条以上的航线从同一网格开始。
______________________________________
f[i]:从i点走到重点要掷骨子几次
f[i]=(f[i+1]+f[i+2]+f[i+3]+f[i+4]+f[i+5]+f[i+6])/6+1
注意飞行线,如果u可以到v而v更大,那么f[u]=f[v]
______________________________________
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=1e5+20; 4 int nxt[maxn]; 5 double f[maxn]; 6 int n,m; 7 8 int main() 9 { 10 while(scanf("%d%d",&n,&m)==2&&(n||m)) 11 { 12 memset(nxt,-1,sizeof nxt); 13 memset(f,0,sizeof f); 14 for(int u,v,i=1;i<=m;++i) 15 { 16 scanf("%d%d",&u,&v); 17 nxt[u]=v; 18 } 19 for(int i=n-1;i>=0;i--) 20 { 21 if(nxt[i]!=-1) 22 { 23 f[i]=f[nxt[i]]; 24 continue; 25 } 26 double tp=0; 27 for(int j=1;j<=6;++j)tp+=f[i+j]; 28 f[i]=tp/6+1; 29 } 30 printf("%.4lf\n",f[0]); 31 } 32 return 0; 33 }