题目链接:LightOJ- Discovering Gold
任何方案都是从1开始在n结束,dp[i]初始化为i点处的金子数,因为从i点往后面
min(6,n−i)
个点的行走的概率是相等的,因此
dp[i]=∑min(6,n−i)j=1dp[i+j]min(6,n−i)
。
从后往前dp,最后答案是dp[1]
#include<bits/stdc++.h>
using namespace std;
const int maxn=107;
double dp[maxn];
double p[maxn];
int main()
{
int T,kase=1;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) cin>>dp[i];
for(int i=n-1;i>=1;i--)
{
int d=min(n-i,6);
for(int j=1;j<=d;j++)
dp[i]+=dp[i+j]/d;
}
printf("Case %d: %.12f\n",kase++,dp[1]);
}
return 0;
}