洛谷 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 }