P1654 OSU!

P1654 OSU!

题意: 给定一串字符串,每一串字符串中的每一位仅存在 0 0 0 1 1 1 两种情况,且出现 1 1 1 的概率为 p [ i ] p[i] p[i],在这个串中了连续的 X X X 1 1 1 可以贡献 X 3 X^3 X3 的分数。这 X X X 1 1 1 不能被其他连续的 1 1 1 所包含,求期望分数。

思路: 首先我们不知道怎么求 X 3 X^3 X3 的期望分数。我们来推导一下式子, ( X + 1 ) 3 (X+1)^3 (X+1)3 = = = X 3 X^3 X3 + + + 3 ∗ X 2 3*X^2 3X2 + + + 3 ∗ X 3*X 3X + 1 +1 +1,那么我们可以发现多的新的贡献是 3 ∗ X 2 3*X^2 3X2 + + + 3 ∗ X 3*X 3X + 1 +1 +1,且此贡献仅在前一位为 1 1 1 的情况下,当前为概率为 p [ i ] p[i] p[i] 的情况下可以转移获得。若当前位为 0 0 0 ,既 ( 1 − p [ i ] ) (1-p[i]) (1p[i]) ∗ * a n s [ i − 1 ] ans[i-1] ans[i1] a n s [ i − 1 ] ans[i-1] ans[i1] 表示上一层 X 3 X^3 X3 的总分数期望。

因此转移方程:
X 1 X^1 X1 = = = X [ i ] X[i] X[i] = = = ( X [ i − 1 ] + 1 ) ∗ p [ i ] (X[i-1]+1)*p[i] (X[i1]+1)p[i]
X 2 X^2 X2 = = = Y [ i ] Y[i] Y[i] = = = ( Y [ i − 1 ] + 2 ∗ X [ i − 1 ] + 1 ) ∗ p [ i ] (Y[i-1]+2*X[i-1]+1)*p[i] (Y[i1]+2X[i1]+1)p[i]
X 3 X^3 X3 = = = ( a n s [ i − 1 ] + 3 ∗ Y [ i − 1 ] + 3 ∗ X [ i − 1 ] + 1 ) ∗ p [ i ] (ans[i-1]+3*Y[i-1]+3*X[i-1]+1)*p[i] (ans[i1]+3Y[i1]+3X[i1]+1)p[i]

三者表示的都是前一位为 1 1 1 情况下所能获得的分数期望。
a n s [ i ] = ( a n s [ i − 1 ] + 3 ∗ Y [ i − 1 ] + 3 ∗ X [ i − 1 ] + 1 ) ∗ p [ i ] + a n s [ i − 1 ] ∗ ( 1 − p [ i ] ) = a n s [ i − 1 ] + ( 3 ∗ Y [ i − 1 ] + 3 ∗ X [ i − 1 ] + 1 ) ∗ p [ i ] ans[i]=(ans[i-1]+3*Y[i-1]+3*X[i-1]+1)*p[i]+ans[i-1]*(1-p[i])=ans[i-1]+(3*Y[i-1]+3*X[i-1]+1)*p[i] ans[i]=(ans[i1]+3Y[i1]+3X[i1]+1)p[i]+ans[i1](1p[i])=ans[i1]+(3Y[i1]+3X[i1]+1)p[i]

Code:

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N = 1e5+10;
int n;
double dp[N];
double x[N];
double y[N];
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		double xx;
		cin>>xx;
		x[i]=(x[i-1]+1)*xx;
		y[i]=(y[i-1]+2*x[i-1]+1)*xx;
		dp[i]=dp[i-1]+(3*y[i-1]+3*x[i-1]+1)*xx;
	}
	printf("%.1lf",dp[n]); 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值