题目大意:
起始位置是1,从1走到n,给你一个骰子(6个面),按点数走,收集每一点上的金子,如果你将要走到的位置在n之内,就继续扔,往前走,如果在n之外,就一直扔到合适的位置为止,求到达n点时的期望

分析: 这个题是一个求期望的题,那么值得注意的是,当扔在n之外的情况是无效的,所以我们在位置 i<n6 的时候 此时的概率应该为 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;
}