飞行棋,从0到n,置骰子,置到几就往前走几步,前进中会有捷径,比如2和5连到一起了,那你走到2时可以直接跳到
5,如果5和8连到一起了,那你还可以继续跳到8,最后问跳到n时平均置几次骰子。也就是求期望。
非常好的入门资料 : 点击打开链接
const int maxn = 100008 ; int to[maxn] ; double dp[maxn] ; int main(){ int i , j , n , m , u , v ; while(cin>>n>>m){ if(n==0 && m==0) break ; memset(to , -1 , sizeof(to)) ; while(m--){ scanf("%d%d" , &u ,&v) ; to[u] = v ; } memset(dp , 0 , sizeof(dp)) ; for(i = n-1 ; i >= 0 ; i--){ if(to[i] != -1) dp[i] = dp[to[i]] ; else{ for(j = 1 ; j <= 6 ; j++) dp[i] += dp[i+j] ; dp[i] = dp[i] / 6.0 + 1.0 ; } } printf("%.4lf\n" , dp[0]) ; } return 0 ; }