题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4405
题意:从0走到n,每次走之前掷一次筛子,掷出几点就向前走几点,走到大于等于n的地方就停止。但是,有些地方可以连着走,即到达这个地方时可以接着到达以后的某个格子。问停止是掷骰子的期望?
思路:
E(i) (i>=n) 全部为0
对于0<i<n E(i)=(E(i+1)+E(i+2)+E(i+3)+E(i+4)+E(i+5)+E(i+6))/6+1
如果i会被传送到j
那么E(i)=E(j)
1 #include<algorithm> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<iostream> 6 int n,m,go[200005],x,y; 7 double f[200005]; 8 int main(){ 9 while (~scanf("%d%d",&n,&m)){ 10 if (n==0&&m==0) return 0; 11 for (int i=0;i<=n;i++) go[i]=0; 12 while (m--) { 13 scanf("%d%d",&x,&y); 14 go[x]=y; 15 } 16 for (int i=n;i<=n+6;i++) f[i]=0; 17 for (int i=n-1;i>=0;i--){ 18 f[i]=0; 19 if (go[i]!=0) f[i]=f[go[i]]; 20 else{ 21 for (int j=1;j<=6;j++) 22 f[i]+=(f[i+j]+1.0)/6.0; 23 } 24 } 25 printf("%.4f ",f[0]); 26 } 27 }