hdu 4405 Aeroplane chess

Posted Omz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 4405 Aeroplane chess相关的知识,希望对你有一定的参考价值。

题意:

走棋游戏,投掷1-6的骰子,投到x,就从这个格子向前走x步。

有些格子有飞机,可以直接飞到更远的格子,也是只能向前飞,每个格子最多有一个飞机。

到达大于等于n的格子,则游戏结束。

问从游戏结束时的投掷格子的期望数。

思路:

期望一般从后往前dp。

假设dp[i]表示到i格时还需要投掷的次数,那么dp[n] = 0。

从n-1逆着dp,那么到一个格子k,如果k有飞机,那么dp[k]就等于dp[flight[k]];

没有飞机,就累加从这个格子之后的6个格子的期望??1/6,再加上这个格子要投掷一次。

代码:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <map>
 5 using namespace std;
 6 const int N = 100000 + 10;
 7 double dp[N];
 8 map<int,int> mmp;
 9 int main()
10 {
11     int n,m;
12     while (scanf("%d%d",&n,&m) != EOF && n + m)
13     {
14         mmp.clear();
15         dp[n] = 0;
16         memset(dp,0,sizeof(dp));
17         for (int i = 0;i < m;i++)
18         {
19             int x,y;
20             scanf("%d%d",&x,&y);
21             mmp[x] = y;
22         }
23         for (int i = n - 1;i >= 0;i--)
24         {
25             if (mmp[i])
26             {
27                 dp[i] = dp[mmp[i]];
28             }
29             else
30             {
31                 double tmp = 0;
32                 for (int j = 1;j <= 6;j++)
33                 {
34                     tmp += dp[i+j] * 1.0 / 6;
35                 }
36                 dp[i] = tmp + 1;
37             }
38         }
39         printf("%.4f\n",dp[0]);
40     }
41     return 0;
42 }

 

以上是关于hdu 4405 Aeroplane chess的主要内容,如果未能解决你的问题,请参考以下文章

HDU - 4405 Aeroplane chess(概率dp)

HDU 4405 ?Aeroplane chess(期望dp)

HDU4405-Aeroplane chess(概率DP求期望)

HDU 4405 Aeroplane chess

HDU 4405 Aeroplane chess(概率dp)

hdu 4405 Aeroplane chess