洛谷 P1654 OSU!(期望dp)

传送门


解题思路

用a[i]表示第i位为1的x^1的期望;

用b[i]表示第i位为1的x^2的期望;

用ans[i]表示前i位的x^3的期望。

显然的是,

  • a[i]=(a[i-1]+1)*p[i]。
  • b[i]=(b[i-1]+2*a[i-1]+1)*p[i]。
  • ans[i]=(ans[i-1]+3*b[i-1]+3*a[i-1]+1)*p[i]+ans[i-1]*(1-p[i])。(因为是前i位的期望,不保证第i位是1)

AC代码

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<iomanip>
 4 using namespace std;
 5 const int maxn=100005;
 6 int n;
 7 double p[maxn],a[maxn],b[maxn],ans[maxn];
 8 int main(){
 9     cin>>n;
10     for(int i=1;i<=n;i++) scanf("%lf",&p[i]);
11     for(int i=1;i<=n;i++){
12         a[i]=(a[i-1]+1)*p[i];
13         b[i]=(b[i-1]+2*a[i-1]+1)*p[i];
14         ans[i]=(ans[i-1]+3*b[i-1]+3*a[i-1]+1)*p[i]+ans[i-1]*(1-p[i]);
15     }
16     cout<<fixed<<setprecision(1)<<ans[n];
17     return 0;
18 }

 

posted @ 2020-10-30 21:52  尹昱钦  阅读(110)  评论(0编辑  收藏  举报