数学期望

· · 个人记录

数学期望

其实我也不是很会

定义:

在概率论和统计学中,数学期望(mean)(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。

说人话:定义E为期望,E_i为事件i的结果(值),P_i为事件i的发生概率,则有

E=\sum E_i*P_i

简单例题:似乎并没有简单例题

例1:换教室

期望dp.

设f[0/1][i][j]表示考虑前i个课程,申请了j次的最小期望,且这一次没有/有申请的最小期望值
设dis[u][v]表示u到v的最短距离(显然可以Floyd求出)

如果不申请,必定失败.否则有k_i的几率成功,1-k_i的几率失败(注意前一次申请也是可能失败的)

f[0][i][j]=min(f[0][i-1][j],min(f[1][i-1][j]+k[i-1]*dis[b[i-1]][a[i]]+(1-k[i-1])*dis[a[i-1]][a[i]]) ```cpp /**********/ #define MAXN 2011 ll n,m,v,e; ll a[MAXN],b[MAXN],dis[MAXN][MAXN]; double k[MAXN]; double f[2][MAXN][MAXN];//f[op][i][j]:in[1,i],change j times,and i is(not)changed. void Floyd() { for(ll k=1;k<=v;++k) for(ll i=1;i<=v;++i) for(ll j=1;j<=v;++j) umin(dis[i][j],dis[i][k]+dis[k][j]); } int main() { memset(dis,0x3f,sizeof dis); n=read(),m=read(),v=read(),e=read(); for(ll i=1;i<=n;++i)a[i]=read(); for(ll i=1;i<=n;++i)b[i]=read(); for(ll i=1;i<=n;++i)scanf("%lf",&k[i]); for(ll i=1;i<=v;++i)dis[i][i]=0; for(ll i=1;i<=e;++i) { ll u=read(),v=read(),w=read(); umin(dis[u][v],w);umin(dis[v][u],w); } Floyd(); for(ll i=0;i<=n;++i) for(ll j=0;j<=m;++j) f[0][i][j]=f[1][i][j]=1e20; f[0][1][0]=0,f[1][1][1]=0; for(ll i=2;i<=n;++i) { f[0][i][0]=f[0][i-1][0]+dis[a[i-1]][a[i]]; for(ll j=1;j<=min(i,m);++j) { f[0][i][j]=std::min( f[0][i-1][j]+dis[a[i-1]][a[i]], f[1][i-1][j]+k[i-1]*dis[b[i-1]][a[i]]+(1-k[i-1])*dis[a[i-1]][a[i]] ); f[1][i][j]=std::min( f[0][i-1][j-1]+k[i]*dis[a[i-1]][b[i]]+(1-k[i])*dis[a[i-1]][a[i]], f[1][i-1][j-1]+ k[i-1]*k[i]*dis[b[i-1]][b[i]]+ k[i-1]*(1-k[i])*dis[b[i-1]][a[i]]+ (1-k[i-1])*k[i]*dis[a[i-1]][b[i]]+ (1-k[i-1])*(1-k[i])*dis[a[i-1]][a[i]] ); } } double ans=1e20; for(ll j=0;j<=m;++j)ans=std::min(ans,std::min(f[0][n][j],f[1][n][j])); printf("%.2lf",ans); return 0; } ```