lightoj1030(期望dp)

有n个格子,初始的时候pos=1,然后丢骰子,然后新的pos为pos+骰子的点数,走到新的pos,可以捡走该pos上的黄金。

特殊的是,如果新的pos超过了n,那么是不会走的,要重新丢骰子。

所以要分当前的位置丢骰子后是不是会超过n来考虑

以第三个样例解释

dp[3] = 9

dp[2] = 1/6*dp[3] + 5/6*dp[2]

然后算出dp[2]后再加上a[2]

同理,dp[1] = 1/6*dp[3]+1/6*dp[2]+4/6*dp[1]

算出dp[1]后,加上a[1]

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #include <algorithm>
 5 #include <iostream>
 6 #include <queue>
 7 #include <stack>
 8 #include <vector>
 9 #include <map>
10 #include <set>
11 #include <string>
12 #include <math.h>
13 using namespace std;
14 #pragma warning(disable:4996)
15 #pragma comment(linker, "/STACK:1024000000,1024000000")
16 typedef __int64 LL;                   
17 const int INF = 1<<30;
18 /*
19 
20 */
21 const int N = 100 + 10;
22 double dp[N];
23 int a[N];
24 int main()
25 {
26     int t, n;
27     scanf("%d", &t);
28     for (int k = 1; k <= t; ++k)
29     {
30         scanf("%d", &n);
31         for (int i = 1; i <= n; ++i)
32             scanf("%d", &a[i]);
33         dp[n] = a[n];
34         for (int i = n - 1; i >= 1; --i)
35         {
36             double tmp = 0;
37             for (int j = i + 1; j <= n &&j - i <= 6; ++j)
38                 tmp += dp[j] / 6;
39             if (n - i < 6)
40             {
41                 tmp *= 6 / (double)((n - i));
42             }
43             dp[i] = tmp + a[i];
44         }
45         printf("Case %d: %.6lf
",k, dp[1]);
46     }
47     return 0;
48 }
View Code
原文地址:https://www.cnblogs.com/justPassBy/p/4744436.html