思路:
dp[i]表示在i位置时,以后可以获得的金子的期望值。
假设往后可以走6步,那么E(i)=(E(i+1)+E(i+2)+E(i+3)+E(i+4)+E(i+5)+E(i+6))/6+val(i);
代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
using namespace std;
#define inf 0x3f3f3f3f
#define MAXN 50005
#define ll long long
int n;
double dp[105];
int main()
{
int t;
scanf("%d",&t);
for(int tt=1;tt<=t;tt++)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf",&dp[i]);
for(int i=n-1;i>0;i--)
{
double sum=0;
int k=min(6,n-i);
for(int j=i+1;j<=i+6 && j<=n;j++)
{
sum+=dp[j];
}
dp[i]+=sum/k;
}
printf("Case %d: %.7f\n",tt,dp[1]);
}
return 0;
}