求助简单概率
  • 板块学术版
  • 楼主IwannaAKIOI
  • 当前回复24
  • 已保存回复24
  • 发布时间2022/12/4 09:46
  • 上次更新2023/10/27 00:33:12
查看原帖
求助简单概率
577481
IwannaAKIOI楼主2022/12/4 09:46

rt,在昨天ABC的E,我按照期望dp的套路写了段玄学代码,主要内容是:

int n=read(),p=read();
f[n]=0,f[n-1]=1;
for(int i=n-2;i>=0;i--){
	f[i]=((f[i+2]*p
	+f[i+1]*(100-p))%mod*inv(100)%mod
	+1)%mod;
}
cout<<f[0]<<endl;

然后它过了。

但是我不知道这个算法是怎么进行的。我能理解的dp是,定义到达点 dd 的概率为 pdp_d,期望为 ede_d,并假设攻击为 22 的概率为 pp ,那么下面的表达式在 d>0d>0 时候成立: pd=p(pd+2)+(1p)(pd+1)p_d=p(p_{d+2})+(1-p)(p_{d+1})

ed=p(pd+2)ed+2+(1p)(pd+1)ed+1pde_d=\frac{p(p_{d+2})e_{d+2}+(1-p)(p_{d+1})e_{d+1}}{p_d}

总的代码长这样(马蜂很丑)

    n=read(),pp=read();
    e[n]=0,p[n]=1;
    per(i,n-1,1){
        p[i]=(100-pp)*p[i+1]+pp*p[i+2];
        p[i]=p[i]%mod*inv(100)%mod;
        e[i]=(100-pp)*p[i+1]%mod*e[i+1]+pp*p[i+2]%mod*e[i+2];
        e[i]=(e[i]%mod*inv(100)%mod*inv(p[i])+1)%mod;
    }
    p[0]=100*p[1]+pp*p[2];
    p[0]=p[0]%mod*inv(100)%mod;
    e[0]=100*p[1]%mod*e[1]+pp*p[2]%mod*e[2];
    e[0]=(e[0]%mod*inv(100)%mod*inv(p[0])+1)%mod;
    cout<<e[0]<<endl;

然后它也过了。

所以第一段代码正确的原理是什么(或者说第一段代码中f表示的状态是什么意思)?求解。

2022/12/4 09:46
加载中...