LightOj_1030 Discovering Gold

时间:2022-03-19 08:25:07

题目链接

题意:

  在一个1 X N 的格子上, 每个格子都有一定的黄金, 你从第一个格子出发, 问到最后一个格子得到黄金的期望。

  每次前进使用骰子投点来决定前进步数, 如果投出的点前进后会超过N, 那么就重新投掷。

思路:

  很直接的期望题。

  概率dp求期望是从后往前求, 每次的概率为 1 / 6.

  dp[i] = 1/6 * (dp[i + 1] + dp[i + 2] + dp[i + 3] + dp[i + 4] + dp[i + 5] + dp[i + 6]) + x[i].

  根据投掷的点数加上当前的位置会不会超过N来确定括号里面加的项, 还有概率。

代码:

  

 #include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <set>
#include <map>
#include <list>
#include <queue>
#include <string>
#include <vector>
#include <fstream>
#include <iterator>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define MAXN 110
#define MOD 1000000007
#define eps 1e-6
int n;
double dp[MAXN]; int main()
{
int T;
int kcase = ;
scanf("%d", &T);
while(T --)
{
scanf("%d", &n);
for(int i = ; i <= n; i ++)
scanf("%lf", &dp[i]);
for(int i = n - ; i >= ; i --)
{
if((n - i) >= )
for(int j = ; j <= ; j ++)
dp[i] += dp[i + j] / 6.0;
else
for(int j = ; j <= (n - i); j ++)
dp[i] += dp[i + j] / (double)(n - i);
}
printf("Case %d: %.7lf\n", ++ kcase, dp[]);
}
return ;
}