其他分享
首页 > 其他分享> > 概率期望

概率期望

作者:互联网

一.理解概率期望的线性性质,通过递推可以求出:

有n个位置放有0/1串,连续的1有s个,则分数为s^3,求分数期望

double a[N],b[N],f[N],p[N];
int main()
{
    n=re();
    _f(i,1,n)
    {
        scanf("%lf",&p[i]);//每一位选择1的概率
    }
_f(i,1,n) { a[i]=(a[i-1]+1)*p[i];//i位是1的期望,相当于是增量 //如果是只要到第i位的期望,a[i]=(a[i-1]+1)*p[i]+(1-p[i])*a[i-1] b[i]=(b[i-1]+1+2*a[i-1])*p[i]; f[i]=(f[i-1]+3*a[i-1]+3*b[i-1]+1)*p[i]+f[i-1]*(1-p[i]);//最后统计答案,相当于是最后一位是1的+不是1的 } chu("%.1lf",f[n]); return 0; }

二概率dp

1.和的期望等于期望的和,因此求变量之间相互不影响的期望值,相当于每个期望值累加

2.对于结合排列组合的dp,枚举必死

通过倒退,算出期望

题目描述
桌面上有R张红牌和B张黑牌,随机打乱顺序后放在桌面上,开始一张一张地翻牌,翻到红牌得到1美元,黑牌则付出1美元。可以随时停止翻牌,在最优策略下平均能得到多少钱。

输入格式
一行输入两个数R,B,其值在0到5000之间

输出格式
在最优策略下平均能得到多少钱。

int r,b;
double f[N][N];
int main()
{
    r=re(),b=re();
    for(int i=0;i<=r;i++)
    {
        for(int j=0;j<=b;j++)//倒推的啊!!! 
        {
            if(i>0)f[i][j]+=(double)i/(double)(i+j)*(f[i-1][j]+1);
            if(j>0)f[i][j]+=(double)j/(double)(i+j)*(f[i][j-1]-1);
            if(f[i][j]<0)f[i][j]=0;
        }
    }
    chu("%.6lf",f[r][b]-0.0000005);
    return 0;
}
/*
概率DP+倒退:
进行变量之间的转移E(R,B)
所以我的dp两维度的阶段表示就是f[r][b]
表示我还剩下r张red和b张blue的期望值 
 那我就是从剩下0张(初始状态)推到剩下所有(初始状态)
 这样的话,因为起始状态是唯一的,不用计算从起始状态到各个末状态的概率,减少出错率 
*/ 

有时候不需要直接算期望,算每种情况发生的概率*贡献值就可以

题目描述
打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地。突然,眼前一道亮光闪过。“我,Nizem,是黑魔法圣殿的守卫者。如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包。

擂台赛一共有N项挑战,各项挑战依次进行。第i项挑战有一个属性ai,如果ai>=0,表示这次挑战成功后可以再获得一个容量为ai的包包;如果ai=-1,则表示这次挑战成功后可以得到一个大小为1 的地图残片。地图残片必须装在包包里才能带出擂台,包包没有必要全部装满,但是队员们必须把 【获得的所有的】地图残片都带走(没有得到的不用考虑,只需要完成所有N项挑战后背包容量足够容纳地图残片即可),才能拼出完整的地图。并且他们至少要挑战成功L次才能离开擂台。

队员们一筹莫展之时,善良的守卫者Nizem帮忙预估出了每项挑战成功的概率,其中第i项挑战成功的概率为pi%。现在,请你帮忙预测一下,队员们能够带上他们获得的地图残片离开擂台的概率。

输入格式
第一行三个整数N,L,K。

第二行N个实数,第i个实数pi表示第i项挑战成功的百分比。

第三行N个整数,第i个整数ai表示第i项挑战的属性值.

输出格式
一个整数,表示所求概率,四舍五入保留6 位小数。

const int N=200+4;
double f[N][N][N<<1],p[N];
int n,l,k,a[N];
int main()
{
    n=re(),l=re(),k=re();
    if(k>n)k=n;//如果大于那么一定能满足背包装得下的要求,类似贪心思想
    _f(i,1,n)
    scanf("%lf",&p[i]),p[i]/=100;
    _f(i,1,n)
    a[i]=re();
    f[0][0][k+n]=1;//初始状态+绝对零点 
    _f(i,1,n)//当前位置 
    {
        _f(j,0,i-1)//前i-1次赢的局数 
        {
            _f(v,0,(n)+n)//前i-1次背包的剩余容积,
// 为了防止负下标所以v这里加n(绝对零点) 
            {
                f[i][j][v]+=f[i-1][j][v]*(1-p[i]);//输了
                if(a[i]==-1)
                {
                    f[i][j+1][v-1]+=f[i-1][j][v]*p[i];
                }    
                else f[i][j+1][min(v+a[i],n+n)]+=f[i-1][j][v]*p[i];
            } 
         } 
     } 
     double ans=0;
    _f(i,l,n)
    {
        _f(j,n,n+n)
        {
            ans+=f[n][i][j];
        }
    }
    chu("%lf",ans);
    return 0;
}
/*
 
 其实就是f[i][j][k]表示i位置,j赢局,k剩余容积的概率
 亮点就是运用了一个只关注主要,
 当我k>=n时,我只需要把它算到n里就可以(因为此时一定可以装得下) 
 还有就是循环的时候,每一层代表的状态,如果发现不好转移,可以灵活变换 
*/

变换主次的思想,不好枚举每种状态,我去枚举对于每个变量的期望,累加,【期望的线性性质+先求概率再求期望】

https://blog.csdn.net/Bfk_zr/article/details/78032709  题解
https://tg.hszxoj.com/contest/343/problem/8   题目

 

标签:概率,期望,int,double,ai,挑战
来源: https://www.cnblogs.com/403caorong/p/16291858.html