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 }

 

posted @ 2019-09-23 19:56  古比  阅读(168)  评论(0编辑  收藏  举报