lightoj1030(期望dp)

时间:2023-03-09 01:51:29
lightoj1030(期望dp)

lightoj1030(期望dp)

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]

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:1024000000,1024000000")
typedef __int64 LL;
const int INF = <<;
/* */
const int N = + ;
double dp[N];
int a[N];
int main()
{
int t, n;
scanf("%d", &t);
for (int k = ; k <= t; ++k)
{
scanf("%d", &n);
for (int i = ; i <= n; ++i)
scanf("%d", &a[i]);
dp[n] = a[n];
for (int i = n - ; i >= ; --i)
{
double tmp = ;
for (int j = i + ; j <= n &&j - i <= ; ++j)
tmp += dp[j] / ;
if (n - i < )
{
tmp *= / (double)((n - i));
}
dp[i] = tmp + a[i];
}
printf("Case %d: %.6lf\n",k, dp[]);
}
return ;
}