期望及期望dp
首先给出期望的定义
期望
简单说就是概率×概率的价值
∵(x+1)3=x3+3x2+3x+1
可以看出每多出一个1,答案就会增加3x2+3x+1
于是可以维护x和x2的期望
x1[i]=(x1[i−1]+1)∗p[i];
x2[i]=(x2[i−1]+2∗x1[i−1]+1)∗p[i];
ans[i]=ans[i−1]+(3∗x2[i−1]+3∗x1[i−1]+1)∗p[i];
ans[n]即是答案
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define ll long long using namespace std; const int maxn=100005; inline ll read(){ ll x=0,k=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-') k=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch-'0');ch=getchar();} return k*x; } double a[maxn],b[maxn],ans[maxn],p[maxn]; int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); int n; n=read(); for(int i=1;i<=n;i++) cin>>p[i]; for(int i=1;i<=n;i++) a[i]=(a[i-1]+1)*p[i]; for(int i=1;i<=n;i++) b[i]=(b[i-1]+2*a[i-1]+1)*p[i]; for(int i=1;i<=n;i++) ans[i]=ans[i-1]+(3*b[i-1]+3*a[i-1]+1)*p[i]; printf("%.1lf",ans[n]); return 0; }
期望dp
求解达到某一目标的期望花费:因为最终的花费无从知晓(不可能从∞推起),所以期望dp需要倒序求解。
一般的套路是f[n]=0即在n时的期望花费为0
在由形如f[i]=g(f[i-1])一类的关系通过移项,合并同类项等求出倒推的式子
有这样的套路式 f = ( ∑ f′ × p ) + w