链接:点击打开链接
题意:给一个1×n的格子,每个格子都有一定的黄金,起点在1,终点在n,通过投掷骰子前进,如果会超过n就重新投,每到一个格子就获得其中的黄金,问到达n能得到的黄金数目的期望。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[105];
double dp[105];
int main(){
int t,n,i,j,cas,tmp;
scanf("%d",&t);
for(cas=1;cas<=t;cas++){ //dp[i]为i点到n点的期望
scanf("%d",&n);
for(i=0;i<=n;i++)
dp[i]=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
dp[n]=a[n];
for(i=n-1;i>=1;i--){
tmp=min(6,n-i); //不够的时候特殊判断
dp[i]=a[i];
for(j=1;j<=tmp;j++)
dp[i]+=(dp[i+j]/tmp);
}
printf("Case %d: %.7lf\n",cas,dp[1]);
}
return 0;
}