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 3∗X2 + + + 3 ∗ X 3*X 3∗X + 1 +1 +1,那么我们可以发现多的新的贡献是 3 ∗ X 2 3*X^2 3∗X2 + + + 3 ∗ X 3*X 3∗X + 1 +1 +1,且此贡献仅在前一位为 1 1 1 的情况下,当前为概率为 p [ i ] p[i] p[i] 的情况下可以转移获得。若当前位为 0 0 0 ,既 ( 1 − p [ i ] ) (1-p[i]) (1−p[i]) ∗ * ∗ a n s [ i − 1 ] ans[i-1] ans[i−1], a n s [ i − 1 ] ans[i-1] ans[i−1] 表示上一层 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[i−1]+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[i−1]+2∗X[i−1]+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[i−1]+3∗Y[i−1]+3∗X[i−1]+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[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]
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;
}