hdu 4405 概率dp

题意:飞行棋,有0~n-1个点,有些点可以直接通向其它点,每次通过掷筛子前进,求从起点到终点的期望

由于求的是期望,所以需要逆推

整体就是求出每个点状态的期望,然后递推到总的

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 const int maxn=100005;
 9 int n,m,t;
10 int hash1[maxn];
11 double dp[maxn];
12 int main()
13 {
14     int i,j,k;
15     #ifndef ONLINE_JUDGE
16     freopen("1.in","r",stdin);
17     #endif
18     while(scanf("%d%d",&n,&m)!=EOF)
19     {
20         if(n==0&&m==0)  break;
21         int a,b;
22         memset(hash1,-1,sizeof(hash1));
23         for(i=0;i<m;i++)
24         {
25             scanf("%d%d",&a,&b);
26             hash1[a]=b;
27         }
28         memset(dp,0,sizeof(dp));
29         for(i=n-1;i>=0;i--)
30         {
31             if(hash1[i]!=-1) dp[i]=dp[hash1[i]];
32             else
33             {
34                 for(j=1;j<=6;j++)   dp[i]+=dp[i+j];
35                 dp[i]=dp[i]/6+1;
36             }
37         }
38         printf("%.4lf\n",dp[0]);
39     }
40 }

 

posted @ 2015-03-26 00:24  miao_a_miao  阅读(78)  评论(0编辑  收藏  举报