P1654 OSU!——期望的线性性质与转化

· · 个人记录

初见

初见的话发现很难处理,因为期望的立方不符合期望的线性性质

于是可以试着转化

一次

考虑长度贡献为1次方的情况

设X1_i为到第i个位置时的期望分数

不难看出:

X1_i=(X1_i+1)\times p_i

可能性有两种,一种为1,接上了之前的期望长度,一种为0一无所有

二次

考虑长度贡献为2次方

设X2_i为到第i个位置时的期望分数

可能性有两种:

也就是说

X2_i=(X2_{i-1}+2\times X1_{i-1}+1)\times p_i

(注意,此时我们并没有将期望本身作乘方,因为期望是不支持这样做的)

三次

回到了题目,考虑长度贡献为3次方

这次dp_i为到第i个位置时的总计期望分数

同上,考虑前面长度为x时,接上增加的量为(x+1)^3-x^3=3\times x^2+3\times x+1

dp_i=dp_{i-1}+(3\times X2+3\times X1+1)

于是就能过了

AC Code:

#include <bits/stdc++.h>
#define db double
using namespace std;

const int MAXN=1e5+5;

int n;
db X1[MAXN],X2[MAXN],dp[MAXN],p[MAXN];

void work(){
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
        scanf("%lf",&p[i]);
    X1[0]=X2[0]=dp[0]=0;
    for(int i=1;i<=n;++i){
        X1[i]=(X1[i-1]+1)*p[i];
        X2[i]=(X2[i-1]+2*X1[i-1]+1)*p[i];
        dp[i]=dp[i-1]+(X2[i-1]*3+X1[i-1]*3+1)*p[i];
    }
    printf("%.01lf",dp[n]);
}//

int main(){
    work();
    return 0;
}