HDU 4405 Aeroplane chess

本题乃水题是也。dp(i)表示当前在第i格时,到达终点需要掷骰子次数的期望。dp(i)=1/6(dp(i + 1) + dp(i + 2) + dp(i + 3) + dp(i + 4)+ dp(i + 5) + dp(i + 6))+1。如果i可以直接跳到某点j,则dp(i)=dp(j)。

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #define maxn 100010
 4 using namespace std;
 5 
 6 int next[maxn];
 7 double d[maxn];
 8 int n,m;
 9 
10 double dp(int i)
11 {
12     double &ans = d[i];
13     if(ans != -1)
14         return ans;
15     if(i >= n)
16         return 0;
17     int temp = next[i];
18     while(temp)
19     {
20         if(next[temp])
21             temp = next[temp];
22         else
23             break;
24     }
25     if(temp)    ans = dp(temp);
26     else
27     {
28         ans = (dp(i + 1) + dp(i + 2) + dp(i + 3) + dp(i + 4)
29                + dp(i + 5) + dp(i + 6)) / 6 + 1;
30     }
31     return ans;
32 }
33 
34 int main()
35 {
36     while(scanf("%d%d",&n,&m),n + m)
37     {
38         int i,a,b;
39         for(i = 0;i < maxn;i++)
40         {
41             d[i] = -1;
42             next[i] = 0;
43         }
44         for(i = 1;i <= m;i++)
45         {
46             scanf("%d%d",&a,&b);
47             next[a] = b;
48         }
49         printf("%.4f\n",dp(0));
50     }
51     return 0;
52 }
posted @ 2012-10-22 22:02  浙西贫农  阅读(160)  评论(0编辑  收藏  举报