题意:
走棋游戏,投掷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 ",dp[0]); 40 } 41 return 0; 42 }