P1654 数学期望 + DP

159 篇文章 1 订阅
该博客探讨了一种动态规划方法来解决OSU!游戏中,根据给定每个位置出现1的概率计算得分期望的问题。通过递推公式计算位置i的期望分数w(i),涉及到了1的连续长度的期望E(xi)和平方期望E(xi2)的求解。最终,通过程序实现求解整个序列的得分期望并输出结果。
摘要由CSDN通过智能技术生成
题意

传送门 P1654 OSU!

题解

设随机变量 x i x_i xi 为位置 i i i 开始向左连续的 1 1 1 的长度。设 w ( i ) w(i) w(i) [ 1 , i ] [1,i] [1,i] 的期望分数。若在位置 i i i 以概率 p i p_i pi 1 1 1,则贡献为 ( x i + 1 ) 3 − x i 3 (x_i+1)^3-x_i^3 (xi+1)3xi3。于是得到递推 w ( i ) = p i [ w ( i − 1 ) + E ( 3 x i 2 + 3 x i + 1 ) ] + ( 1 − p i ) w ( i − 1 ) w(i)=p_i[w(i-1)+E(3x_i^2+3x_i+1)]+(1-p_i)w(i-1) w(i)=pi[w(i1)+E(3xi2+3xi+1)]+(1pi)w(i1) 需要求解 E ( x i ) E(x_i) E(xi) E ( x i 2 ) E(x_i^2) E(xi2),分别设为 f ( i ) , g ( i ) f(i),g(i) f(i),g(i) E ( x i 2 ) E(x_i^2) E(xi2) [ E ( x i ) ] 2 [E(x_i)]^2 [E(xi)]2 不等价,故 f ( i ) , g ( i ) f(i),g(i) f(i),g(i) 需分别求解。观察位置每向右移动一个位置的状态转移,根据递归的思路得到
E ( x i ) = ( 1 − p i ) × 0 + p i × E ( x i − 1 + 1 ) E(x_i)=(1-p_i)\times 0+p_i\times E(x_{i-1}+1) E(xi)=(1pi)×0+pi×E(xi1+1) E ( x i 2 ) = ( 1 − p i ) × 0 + p i × E [ ( x i − 1 + 1 ) 2 ] E(x_i^2)=(1-p_i)\times 0+p_i\times E[(x_{i-1}+1)^2] E(xi2)=(1pi)×0+pi×E[(xi1+1)2] f ( i ) = p i [ f ( i − 1 ) + 1 ] f(i)=p_i[f(i-1)+1] f(i)=pi[f(i1)+1] g ( i ) = p i [ g ( i − 1 ) + 2 f ( i − 1 ) + 1 ] g(i)=p_i[g(i-1)+2f(i-1)+1] g(i)=pi[g(i1)+2f(i1)+1] w ( i ) = w ( i − 1 ) + p i [ 3 g ( i − 1 ) + 3 f ( i − 1 ) + 1 ] w(i)=w(i-1)+p_i[3g(i-1)+3f(i-1)+1] w(i)=w(i1)+pi[3g(i1)+3f(i1)+1]

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int N;
double p[maxn], f[maxn], g[maxn], w[maxn];

int main()
{
	scanf("%d", &N);
	for (int i = 1; i <= N; ++i)
		scanf("%lf", p + i);
	for (int i = 1; i <= N; ++i)
	{
		f[i] = p[i] * (f[i - 1] + 1);
		g[i] = p[i] * (g[i - 1] + 2 * f[i - 1] + 1);
		w[i] = w[i - 1] + p[i] * (3 * g[i - 1] + 3 * f[i - 1] + 1);
	}
	printf("%.1f\n", w[N]);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值