期望及期望dp

首先给出期望的定义

期望

简单说就是概率×概率的价值

 

OSU! 

∵(x+1)3=x3+3x2+3x+1

可以看出每多出一个1,答案就会增加3x2+3x+1

于是可以维护x和x2的期望

x1[i]=(x1[i1]+1)p[i];

x2[i]=(x2[i1]+2x1[i1]+1)p[i];

ans[i]=ans[i1]+(3x2[i1]+3x1[i1]+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;
}
View Code

 

 

期望dp

求解达到某一目标的期望花费:因为最终的花费无从知晓(不可能从∞推起),所以期望dp需要倒序求解。

一般的套路是f[n]=0即在n时的期望花费为0

在由形如f[i]=g(f[i-1])一类的关系通过移项,合并同类项等求出倒推的式子

有这样的套路式 f ∑ f′ × w

 

 

 

posted @ 2018-10-21 19:23  滑稽的大白兔  阅读(287)  评论(0编辑  收藏  举报