Discovering Gold lightoj 1030
一排1到n的格子,每个格子上有黄金 ai ,你最开始在 1 号,每一次投骰子决定到哪一个格子,超出1~n范围则重新投掷,你到了哪个格子就得到哪个格子的金币,问最终在n 能得到金币的期望。
思路:做题经验,期望都是从后推到前,我们从最大开始dp,
1~6 种情况的传递,但是当前面的格子数少于6的时候需要特判;
1 #include<cstdio> 2 #include<algorithm> 3 #include<math.h> 4 #include<string.h> 5 #include<queue> 6 using namespace std; 7 const int maxn=1e3+10; 8 int a[maxn]; 9 double dp[maxn]; 10 int main() 11 { 12 int T; 13 int cnt=0; 14 scanf("%d",&T); 15 while(T--){ 16 int n; 17 scanf("%d",&n); 18 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 19 memset(dp,0,sizeof(dp)); 20 for(int i=n;i>=1;i--){ 21 //对格子数特判的处理 22 double base=n-i; 23 if(base>=6) base=6; 24 25 dp[i]=a[i]; 26 for(int j=1;j<=base;j++){ 27 dp[i]+=dp[i+j]/base; 28 } 29 } 30 printf("Case %d: %f\n",++cnt,dp[1]); 31 } 32 return 0; 33 }