码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 4405 Aeroplane chess

时间:2018-05-07 20:56:04      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:space   代码   using   string   结束   还需要   游戏   ret   表示   

题意:

走棋游戏,投掷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

标签:space   代码   using   string   结束   还需要   游戏   ret   表示   

原文地址:https://www.cnblogs.com/kickit/p/9004523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!