题意:http://www.lightoj.com/volume_showproblem.php?problem=1030

题意就是说给你一个长度为n的序列,初始在1位置,每次可以掷骰子,1-6,如果没有越界,就可以往前走,并且得到目标格子的值。走到最后一个格子结束。问最后获得分数的期望。 一般来说期望都是倒着推。

设dp[i]表示从i号格子出去的期望,那么a[i]+=a[i+step]*1.0/(6,n-i).

a[i]+=(a[i+1]+a[i+2]+a[i+3]+a[i+4]+a[i+5]+a[i+6])/6;

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<vector>
#include<math.h>
#include<string>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define N 100006
#define Lson rood<<1
#define Rson rood<<1|1
double a[N];
int main()
{
    int T,t=1,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            scanf("%lf",&a[i]);
        for(int i=n-1;i>=1;i--)
        {
            int minn=min(6,n-i);
            for(int j=i+1;j<=i+minn;j++)
                a[i]+=1.0/minn*a[j];
        }
        printf("Case %d: %.10f\n",t++,a[1]);
    }
    return 0;
}

 

posted on 2017-11-08 10:09  云胡不喜。  阅读(104)  评论(0编辑  收藏  举报