题意: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 ",t++,a[1]); } return 0; }