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]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n",k, dp[1]); 46 } 47 return 0; 48 }