标签:
给0-n这么多个格子, 初始在0, 然后扔骰子, 扔到几就走几步, 其中有些格子是相连的, 比如2,5相连, 那么到2就可以直接飞到5。 问到n处的期望步数。
首先肯定是倒着推的, dp[n] = 0. 然后如果x, y(x<y)相连, 那么dp[x] = dp[y]。转移方程很好写。具体见代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mem(a) memset(a, 0, sizeof(a)) 4 double dp[100005]; 5 int num, f[100005], vis[100005]; 6 int main() 7 { 8 int n, m, x, y; 9 while(cin>>n>>m) { 10 if(n+m==0) 11 break; 12 mem1(f); 13 while(m--) { 14 scanf("%d%d", &x, &y); 15 f[x] = y; 16 } 17 mem(dp); 18 mem(vis); 19 dp[n] = 0; 20 for(int i = n-1; i>=0; i--) { 21 if(~f[i]) { 22 dp[i] = dp[f[i]]; 23 } else { 24 for(int j = 1; j<=6; j++) { 25 dp[i] += (1+dp[i+j])/6.0; 26 } 27 } 28 } 29 printf("%.4f\n", dp[0]); 30 } 31 }
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define mem(a) memset(a, 0, sizeof(a)) 4 double dp[100005]; 5 int num, f[100005], vis[100005]; 6 int main() 7 { 8 int n, m, x, y; 9 while(cin>>n>>m) { 10 if(n+m==0) 11 break; 12 mem1(f); 13 while(m--) { 14 scanf("%d%d", &x, &y); 15 f[x] = y; 16 } 17 mem(dp); 18 mem(vis); 19 dp[n] = 0; 20 for(int i = n-1; i>=0; i--) { 21 if(~f[i]) { 22 dp[i] = dp[f[i]]; 23 } else { 24 for(int j = 1; j<=6; j++) { 25 dp[i] += (1+dp[i+j])/6.0; 26 } 27 } 28 } 29 printf("%.4f\n", dp[0]); 30 } 31 }
标签:
原文地址:http://www.cnblogs.com/yohaha/p/5015738.html