hdu 4405 Aeroplane chess 概率dp

传送门

给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
", dp[0]);
30     }
31 }
原文地址:https://www.cnblogs.com/yohaha/p/5015738.html