题目大意:
起始位置是1,从1走到n,给你一个骰子(6个面),按点数走,收集每一点上的金子,如果你将要走到的位置在n之内,就继续扔,往前走,如果在n之外,就一直扔到合适的位置为止,求到达n点时的期望
分析: 这个题是一个求期望的题,那么值得注意的是,当扔在n之外的情况是无效的,所以我们在位置i<n−6的时候 此时的概率应该为 1/(n-i),当我们在算权值的时候,我们发现对于位置i来说,它可以到i+1,i+2,……,i+6 这些点,而这些点的权值又与他们后面6个点相关,因此我们倒过来从最后一个点开始求,最后一个点是一定会取的,于是我们就用一个dp数组把他计算一下
#include <bits/stdc++.h>
using namespace std;
int const maxn = 105;
double dp[maxn];
int main()
{
int T;
scanf("%d", &T);
for(int ca = 1; ca <= T; ca++)
{
memset(dp,0,sizeof(dp));
int n;
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%lf", &dp[i]);
for(int i = n - 1; i >= 1; i--)
for(int j = 1; j <= 6; j++)
dp[i] += dp[i + j] / (1.0 * min(6, n - i));
printf("Case %d: %.8f\n", ca, dp[1]);
}
return 0;
}
本文介绍了一个基于动态规划解决的数学期望问题,玩家从起点出发,通过掷骰子前进并收集路径上的金子,目标是计算到达终点时收集到的金子数量的期望值。

被折叠的 条评论
为什么被折叠?



