有 n 个格子,每个格子有一个值,你没走到一个格子就获得这个格子的值,你现在在第 1 个格子,求你到达第 n 个格子的期望获得的值
这个题只能反着求,不能顺序,假设我们有案例 4 1 2 3 4
那么 4 的期望应该是前三个期望/3+第四个值,但是,走到前三个点的的概率相同吗?
显然,从1走到1的概率是1,走到2的概率是1/3,走到3的概率是1/3+1/3*1/2,所以不能顺序直接累加求期望。
那么我们考虑反着求,对于每个点,他等概率走到他后面的六个点,那么以这个点作为起点走到点n的期望就等于他后面六个点作为起点走到n的期望/6+这个点的值。
#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
const ll mod = 1e9 + 7;
int a[1005];
double ans[1005];
int main()
{
int T, ca = 1;
sc("%d", &T);
while (T--)
{
memset(ans, 0, sizeof(ans));
int n;
sc("%d", &n);
for (int i = 1; i <= n; i++)
sc("%d", &a[i]);
for (int i = n; i >= 1; i--)
{
int cnt = min(n - i, 6);
for (int j = i + 1; j <= i + cnt; j++)
{
ans[i] += ans[j];
}
if (cnt)
ans[i] = ans[i] / cnt + a[i];
else
ans[i] = a[i];
}
for (int i = 1; i <= n; i++)
printf("%.2lf ", ans[i]);
}
}