题目链接

前三题水题,直接来到第四题

D-Talk

牛客OI周赛14-普及组 D(数学期望)_i++

官方题解:

牛客OI周赛14-普及组 D(数学期望)_i++_02

 

这里说下我的推法,个人感觉比官方题解容易懂

设dp[i]为从i出发到达n+1的期望步数

那么根据题意推出下面这个公式:

牛客OI周赛14-普及组 D(数学期望)_#include_03

pi的概率成功  所以是乘上f(i+1)+1  这个+1是走了一步,(1-pi)的概率倒退一步

继续化简 把f[i+1]拿到一边去:

牛客OI周赛14-普及组 D(数学期望)_c++_04

去掉负数:

牛客OI周赛14-普及组 D(数学期望)_c++_05

去掉括号化简:

牛客OI周赛14-普及组 D(数学期望)_i++_06

分开后:

牛客OI周赛14-普及组 D(数学期望)_c++_07

化简得跟官方有点差异,因为官方的dp是正着推的,我是逆着推的,我的答案就是负数,取个绝对值就好了。

我的代码绝对和公式一致的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n;
double a[N],d[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
	for(int i=1;i<=n;i++)
		d[i+1]=d[i-1]-(1.0/a[i])+(d[i]-d[i-1])/a[i];
	d[n+1]=abs(d[n+1]); 
	printf("%.3lf\n",d[n+1]);
	return 0;
}